insert_id()一般用于获取新插入数据的id,比如插入的数据是第12条那么这个函数就会返回12整型数值,但是一直返回0是个很严重的问题,获取不到最新id没办法让程序往下运行
参考:
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’
- 具体原因未知,有空再深究
参考另外一篇帖子:
方法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 直接安装并不一定会总是安装最新版本,要是常规办法实在解决不了,尝试检查一下包的版本也不视为一种办法~