小猿圈002 发表于 2019-6-27 17:11:09

小猿圈Python开发之Django框架orM与自定义SQL语句混合事务

学习Python是一件很快乐是事情,不仅可以当以后的工作还可以当为兴趣爱好,小猿圈Python讲师今天分享Django框架orM与自定义SQL语句混合事务,希望对于学习Python的你有所帮助。结合实例形式分析了同一个方法里面既有ORM又有自定义SQL语句的情况下事务控制相关操作技巧。https://upload-images.jianshu.io/upload_images/15397392-561535ee933f47d5.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240


比如用单纯的ORM或者单纯的自定义SQL语句,都比较好控制事务。在前面的一篇文章中已经讲过Django事务小结,但里面没有提到在同一个方法里面既有ORM又有自定义SQL语句的情况。如果是单纯的ORM,可以这样做,假设已经定义好model,User,Category。from django.db import transaction...@commit_on_successdef 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 sqlarraycursor = connection.cursor()ret=""try:    for sql in sqlarray:      cursor.execute(sql)    transaction.commit_unless_managed()except Exception,e:    ret=str(e)cursor.close()return retsqlarray=[]sqlarray.append("insert into table .......")sqlarray.append("update table set.......")ret=batch_execsql(sqlarray)用这种方式,实现自定义SQL语句的事务,只要任何一条语句出错,就会回滚.那么,如果ORM与自定义SQL语句混合如何做呢,我在项目中结合了上面两种方式。比如按如下的方式@commit_on_successdef 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混合事务,就可以这么控制了。以上就是小猿圈Python讲师对于Django框架orM与自定义SQL语句混合事务的介绍,相信通过以上的分享,你对于学习Python开发也有了很深刻的了解Python交流群:874680195,如果还有哪些不懂的可以到小猿圈官网去寻找答案,里面有最新最全面的视频。
页: [1]
查看完整版本: 小猿圈Python开发之Django框架orM与自定义SQL语句混合事务