![[全网最全|已解决]PyMySQL的insert,第1张 [全网最全|已解决]PyMySQL的insert,第1张](/aiimages/%5B%E5%85%A8%E7%BD%91%E6%9C%80%E5%85%A8%7C%E5%B7%B2%E8%A7%A3%E5%86%B3%5DPyMySQL%E7%9A%84insert.png)
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 直接安装并不一定会总是安装最新版本,要是常规办法实在解决不了,尝试检查一下包的版本也不视为一种办法~
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)