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函数编程的一些特性
Apr 13 Python
Python的多维空数组赋值方法
Apr 13 Python
使用python批量化音乐文件格式转换的实例
Jan 09 Python
python自定义线程池控制线程数量的示例
Feb 22 Python
使用python远程操作linux过程解析
Dec 04 Python
导入tensorflow:ImportError: libcublas.so.9.0 报错
Jan 06 Python
Python操作Excel工作簿的示例代码(\*.xlsx)
Mar 23 Python
django 多数据库及分库实现方式
Apr 01 Python
Keras中的两种模型:Sequential和Model用法
Jun 27 Python
使用Python文件读写,自定义分隔符(custom delimiter)
Jul 05 Python
python os.listdir()乱码解决方案
Jan 31 Python
Python-typing: 类型标注与支持 Any类型详解
May 10 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
解决ajax+php中文乱码的方法详解
2013/06/09 PHP
Php无限级栏目分类读取的实现代码
2014/02/19 PHP
php多文件上传实现代码
2014/02/20 PHP
PHP5.3连接Oracle客户端及PDO_OCI模块的安装方法
2016/05/13 PHP
PHP给源代码加密的几种方法汇总(推荐)
2018/02/06 PHP
PHP后台实现微信小程序登录
2018/08/03 PHP
JavaScript使用位运算符判断奇数和偶数的方法
2015/06/01 Javascript
浅析JS运动
2015/12/28 Javascript
使用jQuery监听DOM元素大小变化
2016/02/24 Javascript
对象不支持indexOf属性或方法的解决方法(必看)
2017/05/28 Javascript
js设置随机切换背景图片的简单实例
2017/11/12 Javascript
详解ES6 Promise的生命周期和创建
2019/08/18 Javascript
ES6常用小技巧总结【去重、交换、合并、反转、迭代、计算等】
2019/12/21 Javascript
JS监听组合按键思路及实现过程
2020/04/17 Javascript
不依任何赖第三方,单纯用vue实现Tree 树形控件的案例
2020/09/21 Javascript
[47:04]LGD vs infamous Supermajor小组赛D组 BO3 第二场 6.3
2018/06/04 DOTA
[03:43]TI9战队采访——PSG.LGD
2019/08/22 DOTA
python调用cmd复制文件代码分享
2013/12/27 Python
Python使用email模块对邮件进行编码和解码的实例教程
2016/07/01 Python
微信 用脚本查看是否被微信好友删除
2016/10/28 Python
Python 判断 有向图 是否有环的实例讲解
2018/02/01 Python
Python3之简单搭建自带服务器的实例讲解
2018/06/04 Python
python selenium爬取斗鱼所有直播房间信息过程详解
2019/08/09 Python
Python中import导入不同目录的模块方法详解
2020/02/18 Python
浅谈pytorch中的BN层的注意事项
2020/06/23 Python
澳大利亚儿童精品仓库:Goo & Co.
2019/06/20 全球购物
英国行业制服供应商:Alexandra
2019/09/14 全球购物
英国森林假期:Forest Holidays
2021/01/01 全球购物
Java的五个基础面试题
2016/02/26 面试题
李培根演讲稿
2014/05/22 职场文书
高中班级口号
2014/06/09 职场文书
学校领导班子群众路线整改措施
2014/09/16 职场文书
三严三实对照检查材料思想汇报
2014/09/28 职场文书
SQL SERVER中常用日期函数的具体使用
2021/04/08 SQL Server
教你如何使用Python下载B站视频的详细教程
2021/04/29 Python
Mysql 如何查询时间段交集
2021/06/08 MySQL