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 装饰器功能以及函数参数使用介绍
Jan 27 Python
在Python中使用zlib模块进行数据压缩的教程
Jun 26 Python
Python编程中使用Pillow来处理图像的基础教程
Nov 20 Python
Python 中迭代器与生成器实例详解
Mar 29 Python
python 重定向获取真实url的方法
May 11 Python
Pycharm更换python解释器的方法
Oct 29 Python
python生成器推导式用法简单示例
Oct 08 Python
使用Python 自动生成 Word 文档的教程
Feb 13 Python
什么是python的id函数
Jun 11 Python
python如何更新包
Jun 11 Python
深入了解Python装饰器的高级用法
Aug 13 Python
Python使用xpath实现图片爬取
Sep 16 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 mail()函数使用及配置方法
2014/01/14 PHP
详解PHP中的状态模式编程
2015/08/11 PHP
JavaScript 学习笔记(十三)Dom创建表格
2010/01/21 Javascript
一款基于jQuery的图片场景标注提示弹窗特效
2015/01/05 Javascript
测试IE浏览器对JavaScript的AngularJS的兼容性
2015/06/19 Javascript
AngularJS 整理一些优化的小技巧
2016/08/18 Javascript
利用原生JS自动生成文章标题树的实例
2016/08/22 Javascript
PhotoSwipe异步动态加载图片方法
2016/08/25 Javascript
JS实现焦点图轮播效果的方法详解
2016/12/19 Javascript
AngularJS1.X学习笔记2-数据绑定详解
2017/04/01 Javascript
慕课网题目之js实现抽奖系统功能
2017/09/19 Javascript
vue v-model实现自定义样式多选与单选功能
2018/07/05 Javascript
微信小程序实现收藏与取消收藏切换图片功能
2018/08/03 Javascript
对angularjs框架下controller间的传值方法详解
2018/10/08 Javascript
vue实现滑动到底部加载更多效果
2020/10/27 Javascript
JS实现轮播图效果
2020/01/11 Javascript
JavaScript实现简易计算器小功能
2020/10/22 Javascript
解决VantUI popup 弹窗不弹出或无蒙层的问题
2020/11/03 Javascript
[01:25:38]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第一场 1月19日
2021/03/11 DOTA
Python读取图片属性信息的实现方法
2016/09/11 Python
Python使用正则表达式获取网页中所需要的信息
2018/01/29 Python
Python实现决策树C4.5算法的示例
2018/05/30 Python
Django 通过JS实现ajax过程详解
2019/07/30 Python
Python使用itchat 功能分析微信好友性别和位置
2019/08/05 Python
pytorch中的自定义反向传播,求导实例
2020/01/06 Python
Python定时任务APScheduler安装及使用解析
2020/08/07 Python
护理自荐信
2013/10/22 职场文书
精彩的英文自荐信
2014/01/30 职场文书
2014大学校园光棍节活动策划书
2014/09/29 职场文书
全国法院系统开展党的群众路线教育实践活动综述(全文)
2014/10/25 职场文书
师范生见习报告范文
2014/11/03 职场文书
二审代理词范文
2015/05/25 职场文书
跑吧孩子观后感
2015/06/10 职场文书
2016年优秀团员事迹材料
2016/02/25 职场文书
「回转企鹅罐」10周年纪念展「輪るピングドラム展」海报公开
2022/03/22 日漫
pandas进行数据输入和输出的方法详解
2022/03/23 Python