Django中ORM与自定义SQL混合事务控制详解

林舟
林舟
发布时间:2026-10-12 | 1人浏览过
原创

本文探讨在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程序设计有所帮助。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表