Моя программа Python запрашивает набор таблиц в базе данных MySQL, засыпает 30 секунд, затем снова запрашивает их и т. Д. Рассматриваемые таблицы постоянно обновляются третьей стороной, и (очевидно) я хотел бы видеть новые результаты каждые 30 секунд.
Допустим, мой запрос выглядит так:
"select * from A where A.key > %d" % maxValueOfKeyFromLastQuery
Я регулярно вижу, что моя программа перестает находить новые результаты после одной или двух итераций, даже если новые строки присутствуют в таблицах . Я знаю, что в таблицах присутствуют новые строки, потому что я могу их видеть, когда я выдаю идентичный запрос из интерактивного mysql (т.е. не из Python).
Я обнаружил, что проблема исчезнет в Python, если я разорву свое соединение с базой данных после каждого запроса, а затем установить новый для следующего запроса.
Я подумал, что это может быть проблема кеширования на стороне сервера, как обсуждается здесь: Явное отключение кеша запросов MySQL в некоторых частях программы
Однако:
Когда я проверяю интерактивную оболочку mysql, она говорит это кеширование включено. (Итак, если это проблема кеширования, почему интерактивная оболочка не страдает от этого?)
Если я явно выполняю SET SESSION query_cache_type = OFF
из моей программы Python, проблема все равно возникает .
Создание нового соединения с БД для каждого запроса - единственный способ решить эту проблему.
Как я могу получить свои запросы из Python, чтобы увидеть новые результаты, о которых я знаю?
Вы можете включить автоматическую фиксацию автоматически в MySQLdb! Попробуйте следующее:
conn = MySQLdb.Connect("host", "user", "password")
conn.autocommit(True)
Это дает вам то же поведение, к которому вы привыкли в интерактивной оболочке.