LOFTER for ipad —— 让兴趣,更有趣

点击下载 关闭
Django orm 和自定义SQL混用的事务
林菡 2019-11-20

本文实例讲述了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混合事务,就可以这么控制了。


推荐文章
评论(0)
联系我们|招贤纳士|移动客户端|风格模板|官方博客|侵权投诉 Reporting Infringements|未成年人有害信息举报 0571-89852053|涉企举报专区
网易公司版权所有 ©1997-2024  浙公网安备 33010802010186号 浙ICP备16011220号-11 增值电信业务经营许可证:浙B2-20160599
网络文化经营许可证: 浙网文[2022]1208-054号 自营经营者信息 工业和信息化部备案管理系统网站 12318全国文化市场举报网站
网信算备330108093980202220015号 网信算备330108093980204230011号
分享到
转载我的主页