[全网最全|已解决]PyMySQL的insert_id()函数return0的问题

  • Post author:
  • Post category:mysql


insert_id()一般用于获取新插入数据的id,比如插入的数据是第12条那么这个函数就会返回12整型数值,但是一直返回0是个很严重的问题,获取不到最新id没办法让程序往下运行

参考:




【已解决】Python的Pymysql中INSERT没有返回值希望获取刚插入的记录的对象ID – 在路上


折腾:【记录】设计测评系统的用户注册接口期间,遇到调用之前自己写的:https://github.com/crifan/crifanLib/blob/master/python/crifanLib/中的crifanMysql.py但是发现:此处对于Insert的话,返回的值是空的:而相关代码是:util/crifanLib/crifanMysql.py            executeReturn = cursor.execute(



https://www.crifan.org/_pymysql_insert_does_not_return_value_that_you_want_get_object_id_record_you_just_inserted/



这个帖子很详细的描述了问题的来源和基本解决方法,


cursor.lastrowid


=


12


self


.connection.insert_id()


=


12


after fetchall: cursor.lastrowid


=


12


after fetchall:


self


.connection.insert_id()


=


12


after commit: cursor.lastrowid


=


12


after commit:


self


.connection.insert_id()


=


0

这段输出结果可以很容易说明insert_id什么时候用,在commit之前。对于高并发业务来说也基本能稳定获取插入数据的id,不太推荐

lastrowid这个写法,可能会造成延后什么的。

一些结论:

  • 想要去通过cursor.lastrowid或connection.insert_id()去获取

    • 结果只能在myslq封装的executeSql的内部得到对应的值


    • 且commit后,connection.insert_id()就得不到了,只能返回0

    • 而executeSql的函数调用这里,用了同样的connection或cursor,结果都得不到要的id

      • 用connect,结果(由于是commit之后)connection.insert_id()返回0
      • 用sqlCursor.lastrowid,结果报错:AttributeError: ‘DictCursor’ object has no attribute ‘lastrowid’

        • 具体原因未知,有空再深究

参考另外一篇帖子:




解决pymysql查不到最新数据的办法 – 走看看


最近用 Flask 写了几个接口部署在服务器上,然后用 Pytest 来做测试,但遇到了问题,搞了大半天才把问题解决。 问题场景及原因 问题大概是这样的,我在本地环境用 Pytest 写代码来对服务器



http://t.zoukankan.com/wintest-p-12825371.html



他是在数据库层面去处理这个问题:

方法1:修改MySQL的事务隔离级别

方法2:每次查询操作后,都进行

commit()

提交事务。

方法3:


Python创建pymysql连接时,设置

autocommit=True

,即让其操作后自动提交事务


意思就是两次操作不在一个事务里面,需要提交(commit)操作让新增数据在当前事务可见,那么久要在查询之后commit或者直接设定在连接数据库的时候让autocommit=True

一般来说上述部分已经能够解决问题了,但是依旧没有解决我的问题。奇葩的是一样的代码、一样的容器,除了宿主机不一样之外都是一样的,一个能返回正常的id,另一个就永远返回0.

找了三四天原因之后终于知道问题在哪了:



数据库版本:MySQL=5.7



PyMySQL在正常返回id的环境里面:PyMySQL=1.0.2



PyMySQL在异常返回id的环境里面:PyMySQL=0.8.1




我都是通过pip install PyMySQL安装的,潜意识里我就认为两个版本应该是一样的


当我把0.8.1那个升级到1.0.2,它就正常了~

这个问题实在是太隐晦了,根本想不到是因为包的版本差异造成的bug,而且网上竟然没有说这件事?事实上pip 直接安装并不一定会总是安装最新版本,要是常规办法实在解决不了,尝试检查一下包的版本也不视为一种办法~



版权声明:本文为Andrwin原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。