我的Python程序查詢一組在MySQL數據庫表的,睡30秒,然後再詢問他們,等有問題的表不斷由第三方更新,(顯然)我希望每30秒看到新的結果。慢性陳舊導致的Python
比方說我的查詢看起來像這樣:
"select * from A where A.key > %d" % maxValueOfKeyFromLastQuery
定期我會看到我的程序停止後的一個或兩個迭代尋找新的結果,即使新行是存在的表格中。我知道表中存在新的行,因爲當我從交互式mysql發出相同的查詢(即不是從Python)時,我可以看到它們。
我發現,問題消失在Python,如果我終止每次查詢後我與數據庫的連接,然後建立了一個查詢一個新的。
我想,也許這可能是因爲這裏討論的服務器端緩存的問題:Explicit disable MySQL query cache in some parts of program
但是:
當我檢查的互動mysql外殼,它說,緩存上。 (所以如果這是一個緩存問題,交互shell怎麼不會受到它的影響?)
如果我在我的Python程序中明確執行
SET SESSION query_cache_type = OFF
,問題仍然存在。
爲每個查詢創建一個新的數據庫連接是我能夠使問題消失的唯一方法。
如何從Python獲取我的查詢以查看我知道的新結果?
你不應該使用查詢中的'%'格式運算符。對所有佔位符使用'%s'(不管它們的類型是什麼),並將值傳遞給元組/列表,以便它們可以正確地進行消毒。 – ThiefMaster 2011-05-09 23:01:29
只是一個猜測:確保從數據庫讀取的查詢與事務的其他更改沒有隔離。即在每次讀取之前創建一個新的事務。 – jsw 2011-05-09 23:14:37
@ThiefMaster:'%d'實際上在查詢中是可以的,因爲它強制替換爲整數,不能用於SQL注入攻擊。 – Jonathan 2011-05-10 14:37:51