2011-07-21 7 views
12

Tengo un fragmento de código Python, que interactúa con una base de datos PostgreSQL a través de psycopg.psycopg - Obtenga SQL formateado en lugar de ejecutar

Toda la literatura advierte sobre no hacer el formato sql por uno mismo, y recomienda dejar que el controlador lo haga. Por ejemplo:

cur.execute('select name, age from people where name = %s;', ('ann',)) 

El controlador formatea la cadena sql. Digamos que no quiero ejecutar nada, pero solo quiero la cadena sql completamente formateada. ¿Hay alguna funcionalidad para obtener este SQL formateado en el módulo psycopg?

Respuesta

14

que Wold función de uso curs.mogrify():

SQLstring = curs.mogrify('select name, age from people where name = %s;', ('ann',)) 
+1

Solo para tener en cuenta, el autor de psycopg ha [declarado] (http://permalink.gmane.org/gmane.comp.python.db.psycopg.devel/4775) que mogrify solo debe usarse para fines de depuración. –

+0

Esta función de mogrify necesita DB API 2.0, http://initd.org/psycopg/docs/cursor.html#cursor.mogrify. –

+0

¿Presumiblemente el resultado de esto es bueno para anteponer 'EXPLAIN' y ejecutar para ver el plan de ejecución? –

0

editar: parece que lo siguiente no es del todo correcto, psycopg no usa usa PQexecParams, pero está planeando (ver mi comentario a continuación). Dejar respuesta porque es una abstracción útil, y cierto para la mayoría de las consultas parametrizadas, al parecer no psycopg2 todavía.


En realidad, el controlador no formatea la cadena. Lo que estás usando allí se llama consulta parametrizada: la cadena sql y los parámetros se envían "a través del cable" a postgres exactamente como los has especificado, postgres analiza la cadena de la plantilla y luego inserta los parámetros en el árbol de análisis sintáctico. De esta forma, los parámetros nunca tienen que codificarse o decodificados, por lo que no hay oportunidad de ningún error de codificación, falla o ataque de inyección. OTOH, eso significa que en ningún punto del código hay algo como la rutina de formato que estás buscando.

Para obtener más información, consulte el método "PQexecParams" en la documentación libpq - libpq es la biblioteca de interfaz de cliente de C de nivel de Postgres.

+0

Wow, interesante. Eso debe significar que con las consultas parametrizadas, si se obtiene un error de sintaxis de sql, debe ser el código en sí, y no algunos caracteres impares en el valor de cadena. –

+0

Así fue como siempre había supuesto que las cosas funcionaron, y usted * puede * tratarlo con seguridad como si así fuera como funciona. Sin embargo, acabo de terminar de examinar la fuente psycopg, y parece que * * están manejando el formato de la plantilla y el escape de cadenas en el lado del cliente ([ver git repo] (https://dndg.it/cgi-bin/gitweb. cgi? p = public/psycopg2.git; a = blob; f = psycopg/cursor_type.c; h = 717cf9ccad879a2aa33b71db9a0029be4932ce4c; hb = HEAD # l388)). Aunque parece que están trabajando para usar PQexecParams siempre que sea posible, consulte [this] (http://archives.postgresql.org/psycopg/2011-02/msg00076.php) thread. –

+1

Solo para arrojar un poco de luz .. PQexecParams tiene algunas limitaciones por lo que el formato del lado del cliente de la consulta está allí para quedarse. La razón principal de que mogrify se use solo para la depuración es porque no podemos garantizar que su resultado siempre será la consulta _exact_ enviada al servidor (por ejemplo, si cambiamos a la preparación de la consulta y usamos PQexecParams). – fog

Cuestiones relacionadas