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中关键字is与==的区别简述
Jul 31 Python
Python3 SSH远程连接服务器的方法示例
Dec 29 Python
Python内置random模块生成随机数的方法
May 31 Python
pycharm配置当鼠标悬停时快速提示方法参数
Jul 31 Python
python读取大文件越来越慢的原因与解决
Aug 08 Python
python 的 openpyxl模块 读取 Excel文件的方法
Sep 09 Python
python如何使用jt400.jar包代码实例
Dec 20 Python
pytorch 批次遍历数据集打印数据的例子
Dec 30 Python
在python中利用dict转json按输入顺序输出内容方式
Feb 27 Python
python 串行执行和并行执行实例
Apr 30 Python
python map比for循环快在哪
Sep 21 Python
Python-OpenCV教程之图像的位运算详解
Jun 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
深思 PHP 数组遍历的差异(array_diff 的实现)
2008/03/23 PHP
PHP获取搜索引擎关键字来源的函数(支持百度和谷歌等搜索引擎)
2012/10/03 PHP
php读取大文件示例分享(文件操作类)
2014/04/13 PHP
THINKPHP项目开发中的日志记录实例分析
2014/12/01 PHP
PHP使用ODBC连接数据库的方法
2015/07/18 PHP
php获得文件夹下所有文件的递归算法的简单实例
2016/11/01 PHP
php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例
2019/05/09 PHP
JS 时间显示效果代码
2009/08/23 Javascript
比较详细的关于javascript 解析json的代码
2009/12/16 Javascript
JavaScript Title、alt提示(Tips)实现源码解读
2010/12/12 Javascript
Safari5中alert的无限循环BUG
2011/04/07 Javascript
说明你的Javascript技术很烂的五个原因
2011/04/26 Javascript
JavaScript下通过的XMLHttpRequest发送请求的代码
2011/06/28 Javascript
jQuery带箭头提示框tooltips插件集锦
2014/11/17 Javascript
分享我的jquery实现下拉菜单心的
2015/11/29 Javascript
JS代码随机生成姓名、手机号、身份证号、银行卡号
2016/04/27 Javascript
jQuery之动画效果大全
2016/11/09 Javascript
js实现点击按钮弹出上传文件的窗口
2016/12/23 Javascript
AngularJS改变元素显示状态
2017/04/20 Javascript
原生javascript实现的全屏滚动功能示例
2017/09/19 Javascript
Javascript刷新页面的实例
2017/09/23 Javascript
原生js实现淘宝放大镜效果
2020/10/28 Javascript
vuex实现购物车的增加减少移除
2020/06/28 Javascript
Python+selenium 获取浏览器窗口坐标、句柄的方法
2018/10/14 Python
python使用pdfminer解析pdf文件的方法示例
2018/12/20 Python
python 用Matplotlib作图中有多个Y轴
2020/11/28 Python
【HTML5】Canvas绘制简单图片教程
2016/05/13 HTML / CSS
优秀的茶餐厅创业计划书
2014/01/03 职场文书
军训学生自我鉴定
2014/02/12 职场文书
房地产广告词大全
2014/03/19 职场文书
保护环境标语
2014/06/09 职场文书
婚前协议书范本两则
2014/10/16 职场文书
2014年社区个人工作总结
2014/12/02 职场文书
运动会表扬稿
2015/01/16 职场文书
浅谈Python响应式类库RxPy
2021/06/14 Python
Python制作动态字符画的源码
2021/08/04 Python