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系列之新版本导入httplib模块报ImportError解决方案
May 23 Python
Python实现115网盘自动下载的方法
Sep 30 Python
Python网络编程中urllib2模块的用法总结
Jul 12 Python
git使用.gitignore设置不生效或不起作用问题的解决方法
Jun 01 Python
Python sorted函数详解(高级篇)
Sep 18 Python
记一次python 内存泄漏问题及解决过程
Nov 29 Python
python存储16bit和32bit图像的实例
Dec 05 Python
获取django框架orm query执行的sql语句实现方法分析
Jun 20 Python
python numpy中cumsum的用法详解
Oct 17 Python
Python解压 rar、zip、tar文件的方法
Nov 19 Python
python带参数打包exe及调用方式
Dec 21 Python
Python Pivot table透视表使用方法解析
Sep 11 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
ThinkPHP标签制作教程
2014/07/10 PHP
PHP的时间戳与具体时间转化的简单实现
2016/06/13 PHP
PHP7 标准库修改
2021/03/09 PHP
jQuery 相关控件的事件操作分解
2009/08/03 Javascript
javascript使用activex控件的代码
2011/01/27 Javascript
jquery Mobile入门—外部链接切换示例代码
2013/01/08 Javascript
js日期、星座的级联显示代码
2014/01/23 Javascript
js中arguments,caller,callee,apply的用法小结
2014/01/28 Javascript
jQuery中position()方法用法实例
2015/01/16 Javascript
比较常见的javascript中定义函数的区别
2015/11/09 Javascript
辨析JavaScript中的Undefined类型与null类型
2016/05/26 Javascript
Angular.js跨controller实现参数传递的两种方法
2017/02/20 Javascript
jQuery阻止移动端遮罩层后页面滚动
2017/03/15 Javascript
vue实现全选和反选功能
2017/08/31 Javascript
JS鼠标3次点击事件实现代码及扩展思路
2017/09/12 Javascript
微信jssdk逻辑在vue中的运用详解
2018/11/14 Javascript
python实现迭代法求方程组的根过程解析
2019/11/25 Javascript
ES6 class类链式继承,实例化及react super(props)原理详解
2020/02/15 Javascript
python实现感知器
2017/12/19 Python
python实现树形打印目录结构
2018/03/29 Python
对pycharm代码整体左移和右移缩进快捷键的介绍
2018/07/16 Python
python3中os.path模块下常用的用法总结【推荐】
2018/09/16 Python
Python对象与引用的介绍
2019/01/24 Python
python中pathlib模块的基本用法与总结
2020/08/17 Python
英国知名衬衫品牌美国网站:Charles Tyrwhitt美国
2016/08/28 全球购物
露营世界:Camping World
2017/02/02 全球购物
荷兰照明、灯具和配件网上商店:dmlights
2019/08/25 全球购物
英国第一的滑雪服装和装备零售商:Snow+Rock
2020/02/01 全球购物
有针对性的求职自荐信
2013/11/14 职场文书
2014年党支部学习材料
2014/05/19 职场文书
党员教师四风自我剖析材料
2014/09/30 职场文书
乡镇一岗双责责任书
2015/01/29 职场文书
安全教育培训制度
2015/08/06 职场文书
大学迎新生欢迎词
2015/09/29 职场文书
python spilt()分隔字符串的实现示例
2021/05/21 Python
ubuntu安装jupyter并设置远程访问的实现
2022/03/31 Python