Как отобразить строку SQL, созданную курсором MySQLdb?

#python #mysql-python

#питон #mysql-python #python

Вопрос:

Я хотел бы проверить для себя, как эта строка MySQL переводится курсором:

 cursor.execute("SELECT * from elements where id = %s", (element_id))
  

Есть ли способ получить вычисленную строку SQL и распечатать ее, желательно перед выполнением? (последнее не является абсолютно необходимым — я просто делаю это, потому что я изучаю Python и хочу убедиться, что мои строки SQL очищаются)

Ответ №1:

ДА. Как указал Фердинанд, существует a MySQLdb/cursors.py , содержащий an execute() , который, в свою очередь, вызывает _query() .

Это помещает выполненный запрос в self._executed .

Итак, вы можете получить ее из cursor._executed .

Комментарии:

1. Отлично, спасибо! Еще не начали копаться в функциях python в соответствии с ответом Фердинанда, но полезно знать, где искать.

2. Но какие аргументы вы даете _query ? Требуется только один, кроме self .

3. @MadsSkjern _query запускает запрос для выполнения, который совпадает с _executed . Но вы не должны вызывать ее самостоятельно. Дело было примерно _execute в этом.

Ответ №2:

MySQL-Python не делает ничего особенного, он просто кодирует каждый аргумент для предотвращения SQL-инъекций и использует стандартный % оператор Python для замены %s заполнителей закодированными аргументами.

Если вы действительно хотите увидеть результат, запустите тот же код, cursor.execute() что и:

 from MySQLdb.converters import get_codec

def prepare_sql(cursor, query, args=None):
    if args is not None:
        query = query % tuple(( get_codec(a, cursor.encoders)(db, a) for a in args ))
    return query
  

См . Определение execute() , начинающееся со строки 168 в MySQLdb/cursors.py .