美文网首页大数据 爬虫Python AI Sql小猿圈-IT自学人的小圈子
小猿圈Python开发之Django框架orM与自定义SQL语句

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

作者: f673630174f6 | 来源:发表于2019-06-27 15:45 被阅读0次

    学习Python是一件很快乐是事情,不仅可以当以后的工作还可以当为兴趣爱好,小猿圈Python讲师今天分享Django框架orM与自定义SQL语句混合事务,希望对于学习Python的你有所帮助。结合实例形式分析了同一个方法里面既有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混合事务,就可以这么控制了。

    以上就是小猿圈Python讲师对于Django框架orM与自定义SQL语句混合事务的介绍,相信通过以上的分享,你对于学习Python开发也有了很深刻的了解Python交流群:874680195,如果还有哪些不懂的可以到小猿圈官网去寻找答案,里面有最新最全面的视频。

    相关文章

      网友评论

        本文标题:小猿圈Python开发之Django框架orM与自定义SQL语句

        本文链接:https://www.haomeiwen.com/subject/pwercctx.html