python - Python sql连接池不更新值
问题描述
我有一个与连接池有关的问题,但我不明白。
下面是我的代码,这是行为:
- 从空表开始,我对不存在的值进行 SELECT 查询(无结果)
- 然后我做 INSERT 查询,它成功插入了值
- 但是,在插入一个新值之后,如果我尝试执行更多的 SELECT 语句,它只能工作 3 次中的 2 次,每次第三次尝试总是失败(池大小 = 3。即池大小 = 10,它将正好工作 9 次10 次)
- 最后,如果我重新启动脚本,将初始 SELECT 注释掉(但该值在脚本之前的表中)我得到插入的值并且它每次都有效。
为什么在重新启动脚本之前,这段代码似乎“卡在为没有结果的连接返回空结果”?
(请注意,它会不断打开和关闭来自连接池的连接,因为这是从 Web 应用程序中获取的,其中每个连接/关闭都是不同的 Web 请求。在这里,我将整个“Web”方面从其中删除)
#!/usr/bin/python
import mysql.connector
dbvars = {'host':'h','user':'u','passwd':'p','db':'d'}
# db has 1 empty table 'test' with one varchar field 'id'
con = mysql.connector.connect(pool_name="mypool", pool_size=3, pool_reset_session=False, **dbvars)
cur = con.cursor()
cur.execute("SELECT id FROM test WHERE id = '123';")
result = cur.fetchall()
cur.close()
con.close()
con = mysql.connector.connect(pool_name="mypool")
cur = con.cursor()
cur.execute("INSERT INTO test VALUES ('123');")
con.commit()
cur.close()
con.close()
for i in range(12):
con = mysql.connector.connect(pool_name="mypool")
cur = con.cursor()
cur.execute("SELECT id FROM test WHERE id = '123';")
result = cur.fetchall()
cur.close()
con.close()
print result
上面的输出是:
[(u'123',)]
[]
[(u'123',)]
[(u'123',)]
[]
[(u'123',)]
[(u'123',)]
[]
[(u'123',)]
[(u'123',)]
[]
[(u'123',)]
同样,如果我在插入之前不执行初始 SELECT,那么它们都返回 123(如果它已经在 db 中)。最初的 SELECT 似乎“破坏”了连接池的一个连接。此外,如果我在 INSERT 之前为空结果执行 2 次 SELECT,则 3 个连接中有 2 个是“损坏的”。最后,如果我在插入之前执行 3 次 SELECT,它仍然可以工作 3 次中的 1 次,因为似乎 INSERT“修复”了连接(大概是通过“结果”)。
- Ubuntu 18.04
- Python 2.7.17(2019 年 10 月发布)
- mysql-connector-python 8.0.21(2020 年 6 月)
- MySql 服务器 5.6.10
解决方案
这似乎是 MySQL 的 python 驱动程序中的一个相当严重的错误。也许一些配置不兼容,但显然是一个错误,因为没有显示错误,但它返回错误的查询结果。
我向 MySQL 团队提交了错误报告,其状态目前为“已验证”。
推荐阅读
- angular - 我如何以 IONIC 角度将 H3 标签的数据发送到我的组件
- git - 如何找到 git 进程挂起和终止
- python-3.x - ColumnTransformer 对象没有属性形状错误
- azure - Azure webapp 安全组访问
- java - 调用 glClear(GL_COLOR_BUFFER_BIT) 后 JOGL glDrawArrays 不起作用
- r - 来自 API in Loop for R 的分页响应
- google-apps-script - 如何获取谷歌应用脚本的最后执行时间?
- reactjs - 在启动反应视图之前,通过应用程序启动时的反应初始化数据库和预处理数据
- questdb - IN 运算符不适用于 questdb 的 postgres 变量
- angular - 未捕获的错误:fa-icon/fa-duotone-icon 组件需要属性图标。在 http://localhost:9876/_karma_webpack_/polyfills.js:23598:29