Вывести текущий запрос MySQLdb? - программирование
Подтвердить что ты не робот

Вывести текущий запрос MySQLdb?

Я ищу способ отладки запросов по мере их выполнения, и мне было интересно, есть ли способ, чтобы MySQLdb распечатывал фактический запрос, который он запускал, после того, как он закончил вставлять параметры и все такое? Из документации кажется, что предполагается, что будет вызов Cursor.info(), который предоставит информацию о последнем запуске запроса, но этого не существует в моей версии (1.2.2).

Это кажется очевидным вопросом, но для всех моих поисков я не смог найти ответ. Спасибо заранее.

4b9b3361

Ответ 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))

Ответ 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, чтобы узнать, что получил сервер.

Ответ 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))