本文实例讲述了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语句混合事务控制操作