【发布时间】:2011-08-22 01:17:20
【问题描述】:
我的 Python 程序查询 MySQL DB 中的一组表,休眠 30 秒,然后再次查询它们,等等。有问题的表由第三方不断更新,并且(显然)我希望看到每 30 秒生成一次新结果。
假设我的查询如下所示:
"select * from A where A.key > %d" % maxValueOfKeyFromLastQuery
我经常会看到我的程序在一两次迭代后停止寻找新结果,即使表中存在新行。我知道表中存在新行,因为当我从交互式 mysql(即不是来自 Python)发出相同的查询时,我可以看到它们。
我发现,如果我在每次查询后终止与数据库的连接,然后为下一个查询建立一个新连接,那么 Python 中的问题就会消失。
我认为这可能是服务器端缓存问题,如下所述:Explicit disable MySQL query cache in some parts of program
但是:
当我检查交互式 mysql shell 时,它说缓存已打开。 (所以如果这是一个缓存问题,为什么交互式 shell 不会受到它的影响?)
如果我在 Python 程序中显式执行
SET SESSION query_cache_type = OFF,问题仍然存在。
为每个查询创建一个新的数据库连接是我能够解决问题的唯一方法。
如何从 Python 获取查询以查看我知道的新结果?
【问题讨论】:
-
您不应在查询中使用
%格式运算符。对所有占位符使用%s(无论它们的类型是什么),并传递带有值的元组/列表,以便正确清理它们。 -
只是一个猜测:确保从数据库读取的查询不会与事务的其他更改隔离。 IE。在每次读取之前创建一个新事务。
-
@ThiefMaster:
%d在查询中其实还可以,因为它强制替换为整数,不能用于 SQL 注入攻击。