[全网最全|已解决]PyMySQL的insert

[全网最全|已解决]PyMySQL的insert,第1张

        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 直接安装并不一定会总是安装最新版本,要是常规办法实在解决不了,尝试检查一下包的版本也不视为一种办法~

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/917885.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存