【问题标题】:Python Mysql Connector not getting new contentPython Mysql 连接器没有获得新内容
【发布时间】:2014-09-23 09:19:14
【问题描述】:

我制作了一个简单的 python 脚本,它每 x 秒检查一次 mysql 表并将结果打印到控制台。我使用 MySQL 连接器驱动程序。

但是,运行脚本只会打印初始值。我的意思是,如果我在脚本运行时更改数据库中的值,它不会被脚本注册,它会继续写入初始值。

在while循环中检索值的代码如下:

def get_fans():
    global cnx
    query = 'SELECT * FROM config'
    while True:
        cursor = cnx.cursor()
        cursor.execute(query)
        for (config_name, config_value) in cursor:
            print config_name, config_value
        print "\n"
        cursor.close()
        time.sleep(3)

为什么会这样?

【问题讨论】:

    标签: python mysql


    【解决方案1】:

    很可能是自动提交问题。 MySQL 连接器驱动程序documentation states,它已关闭自动提交。确保在更改表时提交隐式事务。还因为默认隔离是 REPEATABLE READ 你有:

    同一事务中的所有一致性读取都读取快照 由第一次阅读建立。

    所以我猜你必须为你的轮询脚本管理事务。或者将隔离级别更改为READ COMMITTED。

    不过,更好的方法是恢复到 MySQL 客户端默认的自动提交模式。尽管PEP 249 指导最初禁用它,但这只是一个建议,很可能是一个严重的设计错误。它不仅使新手对未提交的更改感到好奇,甚至使您的read-only workload slower 变得复杂,它还使数据层设计复杂化并打破显式优于隐式 Python 禅。甚至像 Django have it rethought 这样的缓慢的东西。

    【讨论】:

    • 我在进入循环之前添加了“cursor.execute('SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;')”。有用!非常感谢。 :D
    猜你喜欢
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    • 2022-01-22
    • 2016-08-30
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    • 2014-07-26
    相关资源
    最近更新 更多