学习Python是一件很快乐是事情,不仅可以当以后的工作还可以当为兴趣爱好,小猿圈Python讲师今天分享Django框架orM与自定义SQL语句混合事务,希望对于学习Python的你有所帮助。结合实例形式分析了同一个方法里面既有ORM又有自定义SQL语句的情况下事务控制相关操作技巧。
比如用单纯的ORM或者单纯的自定义SQL语句,都比较好控制事务。在前面的一篇文章中已经讲过Django事务小结,但里面没有提到在同一个方法里面既有ORM又有自定义SQL语句的情况。
如果是单纯的ORM,可以这样做,假设已经定义好model,User,Category。
from django.db import transaction
...
@commit_on_success
def save_test(request):
user=User(name="aaa",age=30)
user.save()
cat=Category(id=2,name="cat001")
cat.save()
.......
只有在程序成功执行,没错时,才会commit.比如如果cat保存出错,那么user就会回滚。
如果是单纯的自定义SQL语句,可以通过如下方式实现
from django.db import connection, transaction
...
def batch_execsql(sqlarray):
print sqlarray
cursor = connection.cursor()
ret=""
try:
for sql in sqlarray:
cursor.execute(sql)
transaction.commit_unless_managed()
except Exception,e:
ret=str(e)
cursor.close()
return ret
sqlarray=[]
sqlarray.append("insert into table .......")
sqlarray.append("update table set.......")
ret=batch_execsql(sqlarray)
用这种方式,实现自定义SQL语句的事务,只要任何一条语句出错,就会回滚.
那么,如果ORM与自定义SQL语句混合如何做呢,我在项目中结合了上面两种方式。比如按如下的方式
@commit_on_success
def save_company_callinfo(request):
response=HttpResponse()
try:
#==orm 保存部分======
....
model1.save()
....
model2.save()
...
#==自定义SQL 部分====
sqlarray=[]
sqlarray.append("insert into table .......")
sqlarray.append("update table set.......")
ret=batch_execsql(sqlarray)
if len(ret)>0:
transaction.rollback()
response.write('{"status":"no","error":"%s"}' % ('add call information error',))
else:
response.write('{"status":"no","error":"%s"}' % ('',))
except Exception,e:
response.write('{"status":"no","error":"%s"}' % (str(e),))
return response
这上面的过程可以自己修改成自己需要的,我用的是AJAX方式,因为我自己需要,但总体上ORM与自定义SQL混合事务,就可以这么控制了。
以上就是小猿圈Python讲师对于Django框架orM与自定义SQL语句混合事务的介绍,相信通过以上的分享,你对于学习Python开发也有了很深刻的了解Python交流群:874680195,如果还有哪些不懂的可以到小猿圈官网去寻找答案,里面有最新最全面的视频。
网友评论