Вывести текущий запрос MySQLdb?
Я ищу способ отладки запросов по мере их выполнения, и мне было интересно, есть ли способ, чтобы MySQLdb распечатывал фактический запрос, который он запускал, после того, как он закончил вставлять параметры и все такое? Из документации кажется, что предполагается, что будет вызов Cursor.info(), который предоставит информацию о последнем запуске запроса, но этого не существует в моей версии (1.2.2).
Это кажется очевидным вопросом, но для всех моих поисков я не смог найти ответ. Спасибо заранее.
Ответы
Ответ 1
Мы обнаружили атрибут объекта курсора с именем cursor._last_executed
, который содержит последнюю строку запроса, которая запускается даже при возникновении исключения. Это было проще и лучше для нас в производстве, чем использование профилирования все время или ведение журнала MySQL, поскольку оба из них имеют влияние на производительность и включают в себя больше кода или больше коррелируют отдельные файлы журналов и т.д.
Ненавижу отвечать на мой собственный вопрос, но это работает лучше для нас.
Ответ 2
Вы можете распечатать последний выполненный запрос с помощью атрибута курсора _last_executed
:
try:
cursor.execute(sql, (arg1, arg2))
connection.commit()
except:
print(cursor._last_executed)
raise
В настоящее время обсуждается, как получить это как реальную функцию в pymysql (см. pymysql issue # 330: Добавить mogrify в Cursor, который возвращает точную строку, которая будет выполнена; pymysql
следует использовать вместо MySQLdb
)
edit: я не тестировал его, но этот коммит указывает, что следующий код может работать:
cursor.mogrify(sql, (arg1, arg2))
Ответ 3
Для меня/на данный момент _last_executed
больше не работает. В текущей версии вы хотите получить доступ к
cursor.statement
.
см. https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-statement.html
Ответ 4
Один из способов сделать это - включить профилирование:
cursor.execute('set profiling = 1')
try:
cursor.execute('SELECT * FROM blah where foo = %s',[11])
except Exception:
cursor.execute('show profiles')
for row in cursor:
print(row)
cursor.execute('set profiling = 0')
дает
(1L, 0.000154, 'SELECT * FROM blah where foo = 11')
Обратите внимание, что аргумент были вставлены в запрос и что запрос был зарегистрирован даже при неудачном выполнении запроса.
Другой способ - запустить сервер с включенным протоколированием:
sudo invoke-rc.d mysql stop
sudo mysqld --log=/tmp/myquery.log
Затем вам нужно просеять через /tmp/myquery.log, чтобы узнать, что получил сервер.
Ответ 5
Для mysql.connector:
cursor.statement
https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-statement.html
Ответ 6
Я не могу сказать, что когда-либо видел
Cursor.info()
В документации, и я не могу найти ее после нескольких минут поиска. Возможно, вы видели какую-то старую документацию?
В то же время вы всегда можете включить MySQL Query Logging и посмотреть файлы журналов сервера.
Ответ 7
Предположим, что ваш sql похож на select * from table1 where 'name' = %s
from _mysql import escape
from MySQLdb.converters import conversions
actual_query = sql % tuple((escape(item, conversions) for item in parameters))