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操作json数据的一个简单例子
Apr 17 Python
python 二分查找和快速排序实例详解
Oct 13 Python
python+selenium实现京东自动登录及秒杀功能
Nov 18 Python
Python三种遍历文件目录的方法实例代码
Jan 19 Python
Python 批量合并多个txt文件的实例讲解
May 08 Python
Pandas 同元素多列去重的实例
Jul 03 Python
Python2.7环境Flask框架安装简明教程【已测试】
Jul 13 Python
Django处理多用户类型的方法介绍
May 18 Python
Python多线程:主线程等待所有子线程结束代码
Apr 25 Python
python rolling regression. 使用 Python 实现滚动回归操作
Jun 08 Python
深入了解Python 变量作用域
Jul 24 Python
python装饰器三种装饰模式的简单分析
Sep 04 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
如何给phpadmin一个保护
2006/10/09 PHP
dedecms中常见问题修改方法总结
2007/03/21 PHP
PHP函数分享之curl方式取得数据、模拟登陆、POST数据
2014/06/04 PHP
PHP中使用strpos函数实现屏蔽敏感关键字功能
2014/08/21 PHP
YII动态模型(动态表名)支持分析
2016/03/29 PHP
PHP5.0~5.6 各版本兼容性cURL文件上传功能实例分析
2018/05/11 PHP
PHP5.6读写excel表格文件操作示例
2019/02/26 PHP
tp5.0框架隐藏index.php入口文件及模块和控制器的方法分析
2020/02/11 PHP
IE的fireEvent方法概述及应用
2013/02/22 Javascript
javaScript中with函数用法实例分析
2015/06/08 Javascript
JavaScript编程的单例设计模讲解
2015/11/10 Javascript
JS实现上传图片实时预览功能
2017/05/22 Javascript
Vue+Element实现表格编辑、删除、以及新增行的最优方法
2019/05/28 Javascript
javascript实现点亮灯泡特效示例
2019/10/15 Javascript
详解React 条件渲染
2020/07/08 Javascript
vue.js 输入框输入值自动过滤特殊字符替换中问标点操作
2020/08/31 Javascript
[06:43]DAC2018 4.5 SOLO赛 Maybe vs Paparazi
2018/04/06 DOTA
Python字符串格式化输出方法分析
2016/04/13 Python
python去掉行尾的换行符方法
2017/01/04 Python
python编程实现随机生成多个椭圆实例代码
2018/01/03 Python
Python ATM功能实现代码实例
2020/03/19 Python
浅谈在django中使用filter()(即对QuerySet操作)时踩的坑
2020/03/31 Python
有趣的Python图片制作之如何用QQ好友头像拼接出里昂
2020/04/22 Python
解决python3.6用cx_Oracle库连接Oracle的问题
2020/12/07 Python
CSS3 box-sizing属性详解
2016/11/15 HTML / CSS
AmazeUI 导航条的实现示例
2020/08/14 HTML / CSS
New Balance德国官方网站:购买鞋子和服装
2019/08/31 全球购物
澳大利亚最好的电动自行车:Leon Cycle
2020/12/19 全球购物
教育专业自荐书范文
2013/12/17 职场文书
优秀班主任经验交流材料
2014/06/02 职场文书
学校党员个人问题整改措施思想汇报
2014/10/08 职场文书
雷峰塔导游词
2015/02/09 职场文书
房贷收入证明范本
2015/06/12 职场文书
开票证明
2015/06/23 职场文书
2016暑期社会实践新闻稿
2015/11/25 职场文书
javascript Number 与 Math对象的介绍
2021/11/17 Javascript