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之有容乃大的list(3)
Sep 15 Python
利用python程序帮大家清理windows垃圾
Jan 15 Python
Python中的defaultdict与__missing__()使用介绍
Feb 03 Python
python实现读取大文件并逐行写入另外一个文件
Apr 19 Python
浅析python中numpy包中的argsort函数的使用
Aug 30 Python
使用python 写一个静态服务(实战)
Jun 28 Python
python爬虫项目设置一个中断重连的程序的实现
Jul 26 Python
Python配置文件处理的方法教程
Aug 29 Python
Python如何实现邮件功能
May 27 Python
Python web如何在IIS发布应用过程解析
May 27 Python
通过案例解析python鸭子类型相关原理
Oct 10 Python
Django drf请求模块源码解析
Jun 08 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
数据库相关问题
2006/10/09 PHP
php获取mysql版本的几种方法小结
2008/03/25 PHP
解析php中curl_multi的应用
2013/07/17 PHP
PHP 反射(Reflection)使用实例
2015/05/12 PHP
yii 2.0中表单小部件的使用方法示例
2017/05/23 PHP
PHP中如何使用Redis接管文件存储Session详解
2018/11/28 PHP
使用PHPWord生成word文档的方法详解
2019/06/06 PHP
重定向实现代码
2006/11/20 Javascript
javascript网页关闭时提醒效果脚本
2008/10/22 Javascript
js url传值中文乱码之解决之道
2009/11/20 Javascript
IE与Firefox在JavaScript上的7个不同句法分享
2011/10/30 Javascript
页面只能打开一次Cooike如何实现
2012/12/04 Javascript
用js正确判断用户名cookie是否存在的方法
2014/01/28 Javascript
JS实现当前页居中分页效果的方法
2015/06/18 Javascript
jquery实现漫天雪花飞舞的圣诞祝福雪花效果代码分享
2015/08/20 Javascript
jQuery 3 中的新增功能汇总介绍
2016/06/12 Javascript
JavaScript数组、json对象、eval()函数用法实例分析
2019/02/21 Javascript
js图片无缝滚动插件使用详解
2020/05/26 Javascript
JQuery常用简单动画操作方法回顾与总结
2019/12/07 jQuery
vue实现瀑布流组件滑动加载更多
2020/03/10 Javascript
基于Ionic3实现选项卡切换并重新加载echarts
2020/09/24 Javascript
Nest.js环境变量配置与序列化详解
2021/02/21 Javascript
[00:10]神之谴戒
2019/03/06 DOTA
替换python字典中的key值方法
2018/07/06 Python
使用Template格式化Python字符串的方法
2019/01/22 Python
Python根据当前日期取去年同星期日期
2019/04/14 Python
Python3 webservice接口测试代码详解
2020/06/23 Python
python opencv实现图像配准与比较
2021/02/09 Python
Python创建自己的加密货币的示例
2021/03/01 Python
使用HTML5捕捉音频与视频信息概述及实例
2018/08/22 HTML / CSS
澳大利亚制造的蜡烛和扩散器:Glasshouse Fragrances
2018/05/20 全球购物
英国最全面的橄榄球联盟门票网站:Live Rugby Tickets
2018/10/06 全球购物
PyQt 如何创建自定义QWidget
2021/03/24 Python
2015欢度元旦标语口号
2014/12/09 职场文书
写作技巧:如何撰写一份优秀的营销策划书
2019/08/13 职场文书
导游词之嵊泗列岛
2019/10/30 职场文书