¿Imprimir la consulta real que ejecuta MySQLdb?

Estoy buscando una manera de depurar las consultas a medida que se ejecutan y me preguntaba si hay una manera de que MySQLdb imprima la consulta real que ejecuta, después de que haya terminado de insertar los parámetros y todo eso. De la documentación, parece que se supone que debe haber una llamada Cursor.info () que proporcionará información sobre la última consulta realizada, pero esto no existe en mi versión (1.2.2).

Esto parece una pregunta obvia, pero para todas mis búsquedas no he podido encontrar la respuesta. Gracias por adelantado.

Encontramos un atributo en el objeto del cursor llamado cursor._last_executed que contiene la última cadena de consulta para ejecutarse incluso cuando se produce una excepción. Esto fue más fácil y mejor para nosotros en la producción que usar la creación de perfiles todo el tiempo o el registro de consultas de MySQL, ya que ambos tienen un impacto en el rendimiento e implican más código o más archivos de registro separados correlacionados, etc.

Odio responder a mi propia pregunta, pero esto está funcionando mejor para nosotros.

Puede imprimir la última consulta ejecutada con el atributo de cursor _last_executed :

 try: cursor.execute(sql, (arg1, arg2)) connection.commit() except: print(cursor._last_executed) raise 

Actualmente, hay una discusión sobre cómo obtener esto como una característica real en pymysql (vea el problema pymysql # 330: Agregue mogrify a Cursor, que devuelve la cadena exacta a ser ejecutada ; se debe usar MySQLdb lugar de MySQLdb )

edición: no lo probé por ahora, pero este compromiso indica que el siguiente código podría funcionar:

 cursor.mogrify(sql, (arg1, arg2)) 

Para mí / por ahora _last_executed ya no funciona. En la versión actual desea acceder

cursor.statement .

consulte: https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-statement.html

Una forma de hacerlo es activar el perfilado :

 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') 

rendimientos

 (1L, 0.000154, 'SELECT * FROM blah where foo = 11') 

Observe que los argumentos se insertaron en la consulta y que la consulta se registró a pesar de que la consulta falló.

Otra forma es iniciar el servidor con el registro activado:

 sudo invoke-rc.d mysql stop sudo mysqld --log=/tmp/myquery.log 

Luego, debe buscar en /tmp/myquery.log para averiguar qué recibió el servidor.

He tenido suerte con el cursor._last_executed general, pero no funciona correctamente cuando se usa con el cursor.executemany() . Eso deja a todos menos la última afirmación. Básicamente, esto es lo que uso ahora en esa instancia (basado en los ajustes de la fuente del cursor de MySQLDb real):

 def toSqlResolvedList( cursor, sql, dynamicValues ): sqlList=[] try: db = cursor._get_db() if isinstance( sql, unicode ): sql = sql.encode( db.character_set_name() ) for values in dynamicValues : sqlList.append( sql % db.literal( values ) ) except: pass return sqlList 

No puedo decir que haya visto

 Cursor.info() 

En la documentación, y no puedo encontrarla después de unos minutos buscando. Tal vez viste alguna documentación vieja?

Mientras tanto, siempre puede activar el registro de consultas de MySQL y echar un vistazo a los archivos de registro del servidor.

Supongamos que su sql es como 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))