Django框架orM与自定义SQL语句混合事务控制操作


Posted in Python onJune 27, 2019

本文实例讲述了Django框架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混合事务,就可以这么控制了。

希望本文所述对大家基于Django框架的Python程序设计有所帮助。

Python 相关文章推荐
如何处理Python3.4 使用pymssql 乱码问题
Jan 08 Python
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
May 27 Python
Python中Threading用法详解
Dec 27 Python
pytorch + visdom 处理简单分类问题的示例
Jun 04 Python
python与字符编码问题
May 24 Python
基于python进行抽样分布描述及实践详解
Sep 02 Python
Python转换itertools.chain对象为数组的方法
Feb 07 Python
python编程进阶之异常处理用法实例分析
Feb 21 Python
深入浅析python变量加逗号,的含义
Feb 22 Python
Python面向对象程序设计之私有变量,私有方法原理与用法分析
Mar 23 Python
sklearn中的交叉验证的实现(Cross-Validation)
Feb 22 Python
Elasticsearch 基本查询和组合查询
Apr 19 Python
Pycharm保存不能自动同步到远程服务器的解决方法
Jun 27 #Python
Python自定义一个异常类的方法
Jun 27 #Python
django框架事务处理小结【ORM 事务及raw sql,customize sql 事务处理】
Jun 27 #Python
python pytest进阶之conftest.py详解
Jun 27 #Python
详解Python 多线程 Timer定时器/延迟执行、Event事件
Jun 27 #Python
python pytest进阶之fixture详解
Jun 27 #Python
解决pycharm 远程调试 上传 helpers 卡住的问题
Jun 27 #Python
You might like
IIS安装Apache伪静态插件的具体操作图文
2013/07/01 PHP
thinkphp配置连接数据库技巧
2014/12/02 PHP
crontab无法执行php的解决方法
2016/01/25 PHP
功能强大的php分页函数
2016/07/20 PHP
PHP Redis扩展无法加载的问题解决方法
2019/08/22 PHP
laravel 实现根据字段不同值做不同查询
2019/10/23 PHP
JS之Date对象和获取系统当前时间详解
2014/01/13 Javascript
ExtJS4 表格的嵌套 rowExpander应用
2014/05/02 Javascript
利用jquery操作Radio方法小结
2014/10/20 Javascript
jQuery学习笔记之回调函数
2016/08/15 Javascript
前端框架Vue.js构建大型应用浅析
2016/09/12 Javascript
bootstrap快速制作后台界面
2016/12/05 Javascript
AngularJS解决ng-if中的ng-model值无效的问题
2017/06/21 Javascript
微信小程序日期时间选择器使用方法
2018/02/01 Javascript
Promise.all中对于reject的处理方法
2018/08/01 Javascript
浅谈angularJs函数的使用方法(大小写转换,拷贝,扩充对象)
2018/10/08 Javascript
Vue+ElementUI使用vue-pdf实现预览功能
2019/11/26 Javascript
Python多线程学习资料
2012/12/19 Python
python数据库操作常用功能使用详解(创建表/插入数据/获取数据)
2013/12/06 Python
Python实现SMTP发送邮件详细教程
2021/03/02 Python
Python 判断是否为质数或素数的实例
2017/10/30 Python
用Python实现KNN分类算法
2017/12/22 Python
详解pyenv下使用python matplotlib模块的问题解决
2018/11/29 Python
Python编写带选项的命令行程序方法
2019/08/13 Python
利用Python的turtle库绘制玫瑰教程
2019/11/23 Python
python等待10秒执行下一命令的方法
2020/07/19 Python
澳大利亚在线家具店:Luxo Living
2019/03/24 全球购物
北美最大的零售退货翻新商:VIP Outlet
2019/11/21 全球购物
护理专业自我鉴定
2014/01/30 职场文书
论文指导教师评语
2014/04/28 职场文书
交警个人先进事迹材料
2014/05/11 职场文书
爬山的活动方案
2014/08/16 职场文书
解除租房协议书
2014/12/03 职场文书
幼儿园小班工作总结2015
2015/04/25 职场文书
详解MySQL InnoDB存储引擎的内存管理
2021/04/08 MySQL
使用 Apache Superset 可视化 ClickHouse 数据的两种方法
2021/07/07 Servers