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字符串替换实例分析
May 11 Python
Python二叉搜索树与双向链表转换实现方法
Apr 29 Python
Python自动生产表情包
Mar 17 Python
Python数据结构与算法之图结构(Graph)实例分析
Sep 05 Python
Python闭包之返回函数的函数用法示例
Jan 27 Python
python用户管理系统
Mar 13 Python
Python对List中的元素排序的方法
Apr 01 Python
pycharm: 恢复(reset) 误删文件的方法
Oct 22 Python
python 追踪except信息方式
Apr 25 Python
python在协程中增加任务实例操作
Feb 28 Python
Python中seaborn库之countplot的数据可视化使用
Jun 11 Python
python中tkinter复选框使用操作
Nov 11 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
FCKeditor的安装(PHP)
2007/01/13 PHP
php实现的在线人员函数库
2008/04/09 PHP
php download.php实现代码 跳转到下载文件(response.redirect)
2009/08/26 PHP
解析PHP缓存函数的使用说明
2013/05/10 PHP
浅析PHP 按位与或 (^ 、&)
2013/06/21 PHP
基于Swoole实现PHP与websocket聊天室
2016/08/03 PHP
PHP的介绍以及优势详细分析
2019/09/05 PHP
php实现银联商务公众号+服务窗支付的示例代码
2019/10/12 PHP
基于jquery的下拉框改变动态添加和删除表格实现代码
2020/09/12 Javascript
javascript实现控制浏览器全屏
2015/03/30 Javascript
javascript制作游戏开发碰撞检测的封装代码
2015/03/31 Javascript
jQuery插件ImageDrawer.js实现动态绘制图片动画(附源码下载)
2016/02/25 Javascript
JS判断图片是否加载完成方法汇总(最新版)
2016/05/13 Javascript
JavaScript严格模式详解
2017/01/16 Javascript
Node接收电子邮件的实例代码
2017/07/21 Javascript
js模拟百度模糊搜索的实例
2017/08/04 Javascript
详解vue mixins和extends的巧妙用法
2017/12/20 Javascript
基于Vue自定义指令实现按钮级权限控制思路详解
2018/05/23 Javascript
[02:06]DOTA2英雄基础教程 暗影萨满
2013/12/16 DOTA
python处理文本文件并生成指定格式的文件
2014/07/31 Python
在Python中使用matplotlib模块绘制数据图的示例
2015/05/04 Python
设计模式中的原型模式在Python程序中的应用示例
2016/03/02 Python
Python实现的自定义多线程多进程类示例
2018/03/23 Python
pandas创建新Dataframe并添加多行的实例
2018/04/08 Python
详解Pytorch 使用Pytorch拟合多项式(多项式回归)
2018/05/24 Python
详解Python中的type和object
2018/08/15 Python
Django CSRF跨站请求伪造防护过程解析
2019/07/31 Python
Python全局锁中如何合理运用多线程(多进程)
2019/11/06 Python
Python cookie的保存与读取、SSL讲解
2020/02/17 Python
python如何对链表操作
2020/10/10 Python
洛佩桑酒店官方网站:Lopesan Hotels
2019/04/15 全球购物
物业电工岗位职责
2013/11/20 职场文书
校本教研工作制度
2014/01/22 职场文书
美国旅游签证工作证明
2014/10/14 职场文书
超详细教你怎么升级Mysql的版本
2021/05/19 MySQL