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封装对象实现时间效果
Apr 23 Python
python通过文件头判断文件类型
Oct 30 Python
python利用rsa库做公钥解密的方法教程
Dec 10 Python
python实现基于SVM手写数字识别功能
May 27 Python
详解python的ORM中Pony用法
Feb 09 Python
python pycurl验证basic和digest认证的方法
May 02 Python
深入分析python中整型不会溢出问题
Jun 18 Python
python 根据时间来生成唯一的字符串方法
Jan 14 Python
Python利用神经网络解决非线性回归问题实例详解
Jul 19 Python
Python如何使用BeautifulSoup爬取网页信息
Nov 26 Python
Python代码中如何读取键盘录入的值
May 27 Python
详解使用scrapy进行模拟登陆三种方式
Feb 21 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
PHP4实际应用经验篇(6)
2006/10/09 PHP
php根据生日计算年龄的方法
2015/07/13 PHP
PHP函数func_num_args用法实例分析
2015/12/07 PHP
分析PHP中单双引号的误区和双引号小隐患
2016/07/19 PHP
基于php实现的php代码加密解密类完整实例
2016/10/12 PHP
php json转换相关知识(小结)
2018/12/21 PHP
PHP mkdir创建文件夹实现方法解析
2020/11/13 PHP
图片之间的切换
2006/06/26 Javascript
学习ExtJS border布局
2009/10/08 Javascript
JQuery onload、ready概念介绍及使用方法
2013/04/27 Javascript
js怎么终止程序return不行换jfslk
2013/05/30 Javascript
jQuery+css3动画属性制作猎豹浏览器宽屏banner焦点图
2015/03/16 Javascript
深入探讨前端框架react
2015/12/09 Javascript
jQuery实现的超简单点赞效果实例分析
2015/12/31 Javascript
很棒的js选项卡切换效果
2016/07/15 Javascript
Web性能优化系列 10个提升JavaScript性能的技巧
2016/09/27 Javascript
Bootstrap3 datetimepicker控件使用实例
2016/12/13 Javascript
浅谈Node.js CVE-2017-14849 漏洞分析(详细步骤)
2017/11/10 Javascript
vue+iview 兼容IE11浏览器的实现方法
2019/01/07 Javascript
详解从vue-loader源码分析CSS Scoped的实现
2019/09/23 Javascript
极简的Python入门指引
2015/04/01 Python
Python中的变量和作用域详解
2016/07/13 Python
对python遍历文件夹中的所有jpg文件的实例详解
2018/12/08 Python
在python下使用tensorflow判断是否存在文件夹的实例
2019/06/10 Python
Python 爬取淘宝商品信息栏目的实现
2021/02/06 Python
英国网上花店:Bunches
2016/11/29 全球购物
Jeep牧马人、切诺基和自由人零配件:4 Wheel Drive Hardware
2017/07/02 全球购物
Linux管理员面试经常问道的相关命令
2014/12/12 面试题
Java中的基本数据类型所占存储空间大小固定的吗
2012/02/15 面试题
实习自我鉴定
2013/12/15 职场文书
劳动模范事迹材料
2014/01/19 职场文书
2015应届毕业生求职信范文
2015/03/20 职场文书
家长意见和建议怎么写
2015/06/04 职场文书
就业指导讲座心得体会
2016/01/15 职场文书
Win11如何修改dns?Win11修改dns图文教程
2022/01/18 数码科技
python垃圾回收机制原理分析
2022/04/13 Python