PyMySQL 返回旧/快照值/不重新运行查询?

Posted

技术标签:

【中文标题】PyMySQL 返回旧/快照值/不重新运行查询?【英文标题】:PyMySQL returning old/snapshot values/not rerunning query? 【发布时间】:2016-02-07 18:10:39 【问题描述】:

我正在使用pymysql.cursors 和一个从表中加载一行并每秒打印一次的简化代码示例是:

#!/usr/bin/env python3
import pymysql.cursors
import time

conn = pymysql.connect(host='localhost',
     # credentials etc.
     cursorclass=pymysql.cursors.DictCursor)

while True:
    with conn.cursor() as cursor:
        cursor.execute("SELECT * FROM state limit 1;")
        vals = cursor.fetchone()
        print (vals)
        time.sleep(1)

state 是 MariaDb 数据库中具有单行的表。

现在,如果我启动 MySQL 客户端并更改表的内容,则该脚本正在运行时,该脚本会愉快地不断抽出原始值;即它显然没有咨询数据库(!)。

我是 Python 新手,而且我绝对是 PyMySQL 新手,所以如果这是一个愚蠢的问题,请提出建议,但我有一点 RTM,它看起来很奇怪。

【问题讨论】:

您是否在 MySQL 客户端中提交更改? 是的,我的客户端自动提交,我已经测试过了。 【参考方案1】:

我不明白为什么这是必要的,但您可以通过任一方式解决它

    autocommit=True 添加到connect() 参数中。

    cursor.execute() 命令之后调用conn.commit()

似乎默认情况下它会在快照或其他东西处启动事务。我(紧张地!)在 pymysql repo 上提交了issue,因为我在这里没有听到任何消息。这立即关闭了解释

我是repeatable read

如果有人知道比使用autocommit 更好的东西,请告诉我。

【讨论】:

谢谢。这节省了我的时间。 你是我、我的国家和整个世界的英雄。这节省了我整个星期的时间。我也没有找到任何其他方法来防止这个错误。 非常感谢,这节省了我的时间

以上是关于PyMySQL 返回旧/快照值/不重新运行查询?的主要内容,如果未能解决你的问题,请参考以下文章

exist 存在 Python操作mysql pymysql sql注入问题 # 39

使用 Cordova 防止 iOS 应用程序保留屏幕快照

为啥查询不返回值?

Oracle数据库 ORA-01555快照过旧是怎么回事?怎么解决?

面试-Redis

Vue 3 模式在重新打开时返回旧数据