我制作了一个简单的python脚本,每x秒检查一次mysql表并将结果打印到控制台。我使用MySQL连接器驱动程序。
但是,运行脚本只会打印initalial值。我的意思是,如果我在脚本运行时更改数据库中的值,则脚本不会注册它,并且它会继续写入初始值。
在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)
为什么会这样?
答案 0 :(得分:1)
最有可能的是,这是一个自动提交问题。 MySQL连接器驱动程序documentation states,它已关闭自动提交。确保在更改表时提交隐式事务。另外,因为默认隔离是REPEATABLE READ
,你有:
同一事务中的所有一致读取都会读取快照 由第一次阅读建立。
所以我猜你甚至要为你的投票脚本管理交易。或者将隔离级别更改为READ COMMITTED
。
但是,更好的方法是恢复到MySQL客户端默认的自动提交模式。虽然PEP 249指南最初禁用它,但它仅仅是一个提案,很可能是一个严重的设计错误。它不仅让新手想知道未经修改的变化,甚至使你的read-only workload slower,它使数据层设计变得复杂,并且显式中断比隐式 Python zen更好。甚至像Django have it rethought这些迟钝的东西。