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

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

本文探讨在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 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。