Django框架orM与自定义SQL语句混合事务控制操作

  

本文实例讲述了Django框架orM与自定义SQL语句混合事务控制操作。分享给大家供大家参考,具体如下:

  

用单纯的ORM或者单纯的自定义SQL语句,都比较好控制事务。在前面的一篇文章中已经讲过Django事务小结,但里面没有提到在同一个方法里面既有ORM又有自定义SQL语句的情况。

  

如果是单纯的ORM,可以这样做,假设已经定义好模型,用户,一类。

        django。db进口事务   …   @commit_on_success   def save_test(请求):   用户=用户(name=癮aa”、年龄=30)   user.save ()   猫=类别(id=2, name=" cat001 ")   cat.save ()   ……      之前      

只有在程序成功执行,没错时,才会提交。比如如果猫保存出的错,那么用户就会回滚。

  

如果是单纯的自定义SQL语句,可以通过如下方式实现

        django。数据库导入连接,交易   …   def batch_execsql (sqlarray):   打印sqlarray   光标=connection.cursor ()   ret=" "   试一试:   对于sql sqlarray:   cursor.execute (sql)   transaction.commit_unless_managed ()   除了例外,e:   ret=str (e)   cursor.close ()   返回受潮湿腐烂   sqlarray=[]   sqlarray。追加(“插入表.......”)   sqlarray。追加(“更新表设置.......”)   ret=batch_execsql (sqlarray)      之前      

用这种方式,实现自定义SQL语句的事务,只要任何一条语句出错,就会回滚。

  

那么,如果ORM与自定义SQL语句混合如何做呢,我在项目中结合了上面两种方式。比如按如下的方式

        @commit_on_success   def save_company_callinfo(请求):   响应=HttpResponse ()   试一试:   #==orm保存部分======?   model1.save ()   …   model2.save ()   …   #==自定义SQL部分====sqlarray=[]   sqlarray。追加(“插入表.......”)   sqlarray。追加(“更新表设置.......”)   ret=batch_execsql (sqlarray)   如果len (ret)在0:   transaction.rollback ()   响应。写(“{”状态”:“不”,“错误”:“% s”}“%(添加调用信息错误,))   其他:   响应。写(“{”状态”:“不”,“错误”:“% s”}“%”(,))   除了例外,e:   响应。写(“{”状态”:“不”,“错误”:“% s”}“% (str (e)))   返回响应      之前      

这上面的过程可以自己修改成自己需要的,我用的是AJAX方式,因为我自己需要,但总体上ORM与自定义SQL混合事务,就可以这么控制了。

  

希望本文所述对大家基于Django框架的Python程序设计有所帮助。

Django框架orM与自定义SQL语句混合事务控制操作