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 相关文章推荐
Python中字典的基本知识初步介绍
May 21 Python
Python使用OpenCV进行标定
May 08 Python
python 设置输出图像的像素大小方法
Jul 04 Python
Python学习笔记之lambda表达式用法详解
Aug 08 Python
pytorch之ImageFolder使用详解
Jan 06 Python
tensorboard显示空白的解决
Feb 15 Python
VSCode基础使用与VSCode调试python程序入门的图文教程
Mar 30 Python
python集合能干吗
Jul 19 Python
Pycharm如何自动生成头文件注释
Nov 14 Python
python语言time库和datetime库基本使用详解
Dec 25 Python
Python爬虫数据的分类及json数据使用小结
Mar 29 Python
Python 装饰器(decorator)常用的创建方式及解析
Apr 24 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
IIS6.0 开启Gzip方法及PHP Gzip函数分享
2014/06/08 PHP
ThinkPHP CURD方法之table方法详解
2014/06/18 PHP
php switch语句多个值匹配同一代码块应用示例
2014/07/29 PHP
根据一段代码浅谈Javascript闭包
2010/12/14 Javascript
jquery iframe操作详细解析
2013/11/20 Javascript
jquery删除指定的html标签并保留标签内文本内容的方法
2014/04/02 Javascript
js限制checkbox选中个数以限制六个为例
2014/07/15 Javascript
javascript遇到html5的一些表单属性
2015/07/05 Javascript
JS+CSS实现六级网站导航主菜单效果
2015/09/28 Javascript
js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 有什么区别?
2015/11/18 Javascript
JS使用post提交的两种方式
2015/12/03 Javascript
nodeJs爬虫获取数据简单实现代码
2016/03/29 NodeJs
Angular 应用技巧总结
2016/09/14 Javascript
bootstrap下拉列表与输入框组结合的样式调整
2016/10/08 Javascript
jquery.cookie.js的介绍与使用方法
2017/02/09 Javascript
AngularJS学习第一篇 AngularJS基础知识
2017/02/13 Javascript
JavaScript轮播图简单制作方法
2017/02/20 Javascript
vue如何集成raphael.js中国地图的方法示例
2017/08/15 Javascript
React Native中Navigator的使用方法示例
2017/10/13 Javascript
vue-router配合ElementUI实现导航的实例
2018/02/11 Javascript
vue动态改变背景图片demo分享
2018/09/13 Javascript
koa2实现登录注册功能的示例代码
2018/12/03 Javascript
Python2.x版本中基本的中文编码问题解决
2015/10/12 Python
python通过socket实现多个连接并实现ssh功能详解
2017/11/08 Python
python实现图片彩色转化为素描
2019/01/15 Python
通用C#笔试题附答案
2016/11/26 面试题
介绍一下Make? 为什么使用make
2016/07/31 面试题
物业公司采购员岗位职责
2013/12/31 职场文书
销售主管的自我评价分享
2014/01/03 职场文书
代理班主任的自我评价
2014/02/04 职场文书
幼儿园教师岗位职责
2014/03/17 职场文书
大学生党员学习焦裕禄精神思想汇报
2014/09/10 职场文书
2014年社区综治工作总结
2014/11/17 职场文书
老龙头导游词
2015/02/11 职场文书
雨雪天气温馨提示
2015/07/15 职场文书
Sql-Server数据库单表查询 4.3实验课
2021/04/05 SQL Server