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数组复制拷贝的实现方法
Jun 09 Python
基于hashlib模块--加密(详解)
Jun 21 Python
Python字符串格式化的方法(两种)
Sep 19 Python
Python使用Flask-SQLAlchemy连接数据库操作示例
Aug 31 Python
Python sorted函数详解(高级篇)
Sep 18 Python
python+selenium 定位到元素,无法点击的解决方法
Jan 30 Python
ubuntu 16.04下python版本切换的方法
Jun 14 Python
利用python实现.dcm格式图像转为.jpg格式
Jan 13 Python
使用celery和Django处理异步任务的流程分析
Feb 19 Python
如何基于python实现不邻接植花
May 01 Python
python 常见的排序算法实现汇总
Aug 21 Python
PyTorch 导数应用的使用教程
Aug 31 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安全配置 如何配置使其更安全
2011/12/16 PHP
PHP实现ftp上传文件示例
2014/08/21 PHP
Yii把CGridView文本框换成下拉框的方法
2014/12/03 PHP
php站内搜索关键词变亮的实现方法
2014/12/30 PHP
PHP中使用SimpleXML检查XML文件结构实例
2015/01/07 PHP
Laravel 5框架学习之模型、控制器、视图基础流程
2015/04/08 PHP
PHP SPL标准库之文件操作(SplFileInfo和SplFileObject)实例
2015/05/11 PHP
Ajax PHP JavaScript MySQL实现简易无刷新在线聊天室
2016/08/17 PHP
PHP微信API接口类
2016/08/22 PHP
利用PHP如何统计Nginx日志的User Agent数据
2019/03/06 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
JS 去除Array中的null值示例代码
2013/11/20 Javascript
JS简单操作select和dropdownlist实例
2014/11/26 Javascript
Javascript核心读书有感之表达式和运算符
2015/02/11 Javascript
Linux下为Node.js程序配置MySQL或Oracle数据库的方法
2016/03/19 Javascript
JS数组操作中的经典算法实例讲解
2017/07/26 Javascript
Vue.js通用应用框架-Nuxt.js的上手教程
2017/12/25 Javascript
说说如何使用Vuex进行状态管理(小结)
2019/04/14 Javascript
JS匿名函数内部this指向问题详析
2019/05/10 Javascript
搭建一个nodejs脚手架的方法步骤
2019/06/28 NodeJs
ES6 Object.assign()的用法及其使用
2020/01/18 Javascript
[50:29]2014 DOTA2华西杯精英邀请赛 5 24 DK VS iG
2014/05/26 DOTA
使用setup.py安装python包和卸载python包的方法
2013/11/27 Python
Python编程中的反模式实例分析
2014/12/08 Python
Python读csv文件去掉一列后再写入新的文件实例
2017/12/28 Python
Python 一键制作微信好友图片墙的方法
2019/05/16 Python
python virtualenv虚拟环境配置与使用教程详解
2020/07/13 Python
Python爬虫之Selenium设置元素等待的方法
2020/12/04 Python
奥兰多迪士尼门票折扣:Undercover Tourist
2018/07/09 全球购物
幼儿园大班新学期寄语
2014/01/18 职场文书
家长给孩子的评语
2014/01/30 职场文书
幼师大班个人总结
2015/02/13 职场文书
医院合作意向书范本
2015/05/08 职场文书
Js类的构建与继承案例详解
2021/09/15 Javascript
CSS中calc(100%-100px)不加空格不生效
2023/05/07 HTML / CSS