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 相关文章推荐
django自定义Field实现一个字段存储以逗号分隔的字符串
Apr 27 Python
python 递归深度优先搜索与广度优先搜索算法模拟实现
Oct 22 Python
Python类和对象的定义与实际应用案例分析
Dec 27 Python
Django REST framework 视图和路由详解
Jul 19 Python
Python调用钉钉自定义机器人的实现
Jan 03 Python
Python如何爬取qq音乐歌词到本地
Jun 01 Python
Django contrib auth authenticate函数源码解析
Nov 12 Python
Django多个app urls配置代码实例
Nov 26 Python
利用python+request通过接口实现人员通行记录上传功能
Jan 13 Python
python程序实现BTC(比特币)挖矿的完整代码
Jan 20 Python
python之np.argmax()及对axis=0或者1的理解
Jun 02 Python
整理Python中常用的conda命令操作
Jun 15 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
关于使用key/value数据库redis和TTSERVER的心得体会
2013/06/28 PHP
PHP 使用memcached简单示例分享
2015/03/05 PHP
基于laravel制作APP接口(API)
2016/03/15 PHP
php数据访问之增删改查操作
2016/05/09 PHP
总结PHP中数值计算的注意事项
2016/08/14 PHP
(仅IE下有效)关于checkbox 三态
2007/05/12 Javascript
window.open的页面如何刷新(父页面)上层页面
2012/12/28 Javascript
利用JQuery动画制作滑动菜单项效果实现步骤及代码
2013/02/07 Javascript
通过js来制作复选框的全选和不选效果
2014/05/22 Javascript
基于NodeJS的前后端分离的思考与实践(一)全栈式开发
2014/09/26 NodeJs
node.js中的fs.appendFile方法使用说明
2014/12/17 Javascript
基于Arcgis for javascript实现百度地图ABCD marker的效果
2015/09/12 Javascript
js实现跨域的多种方法
2015/12/25 Javascript
点击按钮出现60秒倒计时的简单js代码(推荐)
2016/06/07 Javascript
JavaScript实现邮箱地址自动匹配功能代码
2016/11/28 Javascript
Bootstrap里的文件分别代表什么意思及其引用方法
2017/05/01 Javascript
详解Vue双向数据绑定原理解析
2017/09/11 Javascript
webpack实现一个行内样式px转vw的loader示例
2018/09/13 Javascript
JS中使用cavas截图网页并解决跨域及模糊问题
2018/11/13 Javascript
vue过滤器用法实例分析
2019/03/15 Javascript
vue中的面包屑导航组件实例代码
2019/07/01 Javascript
微信JS-SDK实现微信会员卡功能(给用户微信卡包里发送会员卡)
2019/07/25 Javascript
vue如何使用外部特殊字体的操作
2020/07/30 Javascript
Python抓取手机号归属地信息示例代码
2016/11/28 Python
Python 使用matplotlib模块模拟掷骰子
2019/08/08 Python
pycharm 设置项目的根目录教程
2020/02/12 Python
Python为何不支持switch语句原理详解
2020/10/21 Python
为2021年的第一场雪锦上添花:用matplotlib绘制雪花和雪景
2021/01/05 Python
北承题目(C++)
2012/05/16 面试题
财务工作个人求职的自我评价
2013/12/19 职场文书
俄语专业职业生涯规划
2014/02/26 职场文书
贷款委托书
2014/08/01 职场文书
学校百日安全活动总结
2015/05/07 职场文书
Python打包为exe详细教程
2021/05/18 Python
详解Go与PHP的语法对比
2021/05/29 PHP
零基础学java之循环语句的使用
2022/04/10 Java/Android