2017-01-31 8 views
0

Я пытаюсь записать все запросы SQLAlchemy в консоль, анализируя запрос и заполняя параметры (например, перевод :param_1 на 123). Мне удалось найти этот answer на SO, который делает именно это. Проблема, с которой я сталкиваюсь, заключается в том, что параметры не всегда переводятся.Как распечатать фактический запрос, сгенерированный SQLAlchemy?

Вот это событие, я защелкивания на -

@event.listens_for(Engine, 'after_execute', named=True) 
def after_cursor_execute(**kw): 
    conn = kw['conn'] 
    params = kw['params'] 
    result = kw['result'] 
    stmt = kw['clauseelement'] 
    multiparams = kw['multiparams'] 

    print(literalquery(stmt)) 

Выполнение этого запроса не сможет перевести свои параметры. Вместо этого я буду видеть :param_1 на выходе -

Model.query.get(123) 

Это дает CompileError исключение с сообщением Bind parameter '%(38287064 param)s' without a renderable value not allowed here..

Однако, этот запрос будет переводить :param_1 в 123 как я ожидал бы -

db.session.query(Model).filter(Model.id == 123).first() 

Есть ли способ, чтобы перевести любые запросы, которые выполняются с помощью SQLAlchemy?

FWIW Я нацелился на SQL Server, используя драйвер pyodbc.

ответ

0

Если вы создали рамки протоколирования, вы можете получить операторы SQL регистрируемого, установив sqlalchemy.engine регистратор на уровне INFO, например:

import logging 

logging.basicConfig() 
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO) 
+0

Проблема с этим состоит в том, что параметры не встраиваются в запрос что затрудняет копирование/вставку в базу данных без ручного заполнения отсутствующих регистраторов параметров. – onetwothree

 Смежные вопросы

  • Нет связанных вопросов^_^