Django中ORM与自定义SQL混合事务控制详解
本文探讨在Django框架下,如何在同一方法中同时使用ORM模型保存与自定义SQL语句执行,并实现统一的事务控制。通过示例展示了纯ORM、纯SQL及两者混合场景下的提交与回滚逻辑,确保数据一致性。
本文介绍Django框架中ORM模型与自定义SQL语句混合使用时的事务控制方法,供参考。
单独使用ORM或单独使用自定义SQL语句时,事务控制相对简单。前文已总结Django事务基础,但未涵盖在同一方法内同时包含ORM操作与自定义SQL语句的场景。
若仅使用ORM,假设已定义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() .......
仅当程序成功执行且无错误时才提交事务。例如,若Category保存失败,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混合事务的控制逻辑。
希望本文对基于Django框架的Python程序设计有所帮助。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









