2011-06-14 16 views
10

Estoy usando SQLAlchemy y me gustaría registrar ejecutado código SQL (es decir, el código con todos los parámetros de enlace ya citados y reemplazados). En el caso de psycopg2 fue posible utilizando el atributo query del objeto Cursor (ver psycopg documentation). En el caso de MySQLdb es posible usar el atributo _last_executed del objeto Cursor.Cómo recuperar el código SQL ejecutado desde SQLAlchemy

Mi pregunta es: ¿Cómo puedo recuperar la cadena de consulta recién ejecutada utilizando las interfaces SQLAlchemy? ¿Proporciona esa funcionalidad o debería escribir mi propia función auxiliar?

Gracias de antemano por cualquier ayuda.

Respuesta

21

SQLAlchemy uses the standard Python logging library. Para iniciar una sesión de consultas en un archivo denominado db.log:

import logging 

logging.basicConfig(filename='db.log') 
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO) 

Cuando se utiliza el registro de Python, asegurar que todos los echo banderas se establecen en False, para evitar la tala duplicado. Ahora añadir algo a la db:

>>> Movie(title=u"Blade Runner", year=1982) 
>>> session.commit() 

Qué va a registrar algo como:

INFO:sqlalchemy.engine.base.Engine:BEGIN (implicit) 
INFO:sqlalchemy.engine.base.Engine:INSERT INTO models_movie (title, year, description) VALUES (%(title)s, %(year)s, %(description)s) RETURNING models_movie.id 
INFO:sqlalchemy.engine.base.Engine:{'title': u'Blade Runner', 'description': None, 'year': 1982} 
INFO:sqlalchemy.engine.base.Engine:COMMIT 
+1

Es cierto, pero (a) esto también puede enviar mensajes a la salida estándar, (b) se puede establecer un efecto similar simplemente estableciendo el atributo 'echo' de un motor específico en True, y (c) el registro de SQLA no muestra la consulta con marcadores de posición reemplazados, aunque registra el SQL paramétrico y los parámetros por separado. –

+1

@Vinay Esos son buenos puntos, he actualizado mi respuesta para ilustrar cómo usar el registro de Python para registrar específicamente en un archivo, y mostrar un ejemplo de salida de registro – zeekay

+1

Eso es genial, y usted ya tenía mi voto popular :-) –

Cuestiones relacionadas