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笔记(2)
Oct 24 Python
在Python的gevent框架下执行异步的Solr查询的教程
Apr 16 Python
python基础教程之分支、循环简单用法
Jun 16 Python
python Web开发你要理解的WSGI & uwsgi详解
Aug 01 Python
python-opencv 将连续图片写成视频格式的方法
Jan 08 Python
简单了解python代码优化小技巧
Jul 08 Python
python lambda表达式(匿名函数)写法解析
Sep 16 Python
python scrapy重复执行实现代码详解
Dec 28 Python
Django 再谈一谈json序列化
Mar 16 Python
将不规则的Python多维数组拉平到一维的方法实现
Jan 11 Python
python之json文件转xml文件案例讲解
Aug 07 Python
Python+Tkinter打造签名设计工具
Apr 01 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
附件名前加网站名
2008/03/23 PHP
php循环创建目录示例分享(php创建多级目录)
2014/03/04 PHP
php向js函数传参的几种方法
2014/08/10 PHP
PHP中key和current,next的联合运用实例分析
2016/03/29 PHP
php实现与python进行socket通信的方法示例
2017/08/30 PHP
laravel migrate初学常见错误的解决方法
2017/10/11 PHP
js 跨域和ajax 跨域问题小结
2009/07/01 Javascript
JavaScript 事件对象介绍
2015/04/13 Javascript
基于JavaScript代码实现兼容各浏览器的设为首页和加入收藏
2016/01/07 Javascript
纯js实现动态时间显示
2020/09/07 Javascript
JS实现json的序列化和反序列化功能示例
2017/06/13 Javascript
详解react-router如何实现按需加载
2017/06/15 Javascript
微信小程序商品到详情的实现
2017/06/27 Javascript
JavaScript数组的5种迭代方法
2017/09/29 Javascript
JavaScript实现JSON合并操作示例【递归深度合并】
2018/09/07 Javascript
[03:09]2014DOTA2国际邀请赛 Mushi前队友送上祝福
2014/07/12 DOTA
[10:54]Team Spirit vs Navi
2018/06/07 DOTA
python定时执行指定函数的方法
2015/05/27 Python
关于Python中异常(Exception)的汇总
2017/01/18 Python
Python Flask基础教程示例代码
2018/02/07 Python
Tensorflow使用tfrecord输入数据格式
2018/06/19 Python
将pandas.dataframe的数据写入到文件中的方法
2018/12/07 Python
Python数据结构dict常用操作代码实例
2020/03/12 Python
Jupyter Notebook远程登录及密码设置操作
2020/04/10 Python
英国豪华针织品牌John Smedley的在线销售商:The Outlet by John Smedley
2018/04/08 全球购物
六年级数学教学反思
2014/02/03 职场文书
学生期末评语大全
2014/04/30 职场文书
审计局2014法制宣传日活动总结
2014/11/01 职场文书
司机个人年终总结
2015/03/03 职场文书
幼儿园校车安全责任书
2015/05/08 职场文书
导游词之韩国济州岛
2019/10/28 职场文书
Python基础之hashlib模块详解
2021/05/06 Python
基于tensorflow权重文件的解读
2021/05/26 Python
铁头也玩根德 YachtBoy YB-230......
2022/04/05 无线电
Mysql 一主多从的部署
2022/05/20 MySQL
python标准库ElementTree处理xml
2022/05/20 Python