update query examples sql postgresql psycopg2

query - psycopg2 equivalente de mysqldb.escape_string?



psycopg2 query examples (4)

Como dijo Piro, escapar es automático. Pero hay un método para devolver también el sql completo escapado por psycopg2 usando cursor.mogrify (sql, [params])

Estoy pasando algunos valores a un campo de caracteres postgres usando psycopg2 en Python. Algunos de los valores de cadena contienen puntos, barras diagonales, comillas, etc.

Con MySQL acabo de escapar de la cadena con

MySQLdb.escape_string(my_string)

¿Hay un equivalente para psycopg2?


El escape es automático, solo hay que llamar:

cursor.execute("query with params %s %s", ("param1", "pa''ram2"))

(observe que el operador python% no se usa) y los valores se escaparán correctamente.

Puede escapar manualmente una variable usando extensions.adapt(var) , pero esto podría ser propenso a errores y no tener en cuenta la codificación de la conexión: no se debe usar en el código del cliente normal.


En el improbable caso de que los parámetros de consulta no sean suficientes y usted necesite escapar las cadenas, puede usar las constantes de cadena escapadas de Postgres junto con la repr de Python (porque las reglas de Python para escapar de caracteres no ascii y unicode son las mismas que las de Postgres):

def postgres_escape_string(s): if not isinstance(s, basestring): raise TypeError("%r must be a str or unicode" %(s, )) escaped = repr(s) if isinstance(s, unicode): assert escaped[:1] == ''u'' escaped = escaped[1:] if escaped[:1] == ''"'': escaped = escaped.replace("''", "//'") elif escaped[:1] != "''": raise AssertionError("unexpected repr: %s", escaped) return "E''%s''" %(escaped[1:-1], )


Psycopg2 no tiene tal método. Tiene una extension para adaptar los valores de Python a los objetos de ISQLQuote, y estos objetos tienen un método getquoted() para devolver valores compatibles con PostgreSQL.

Vea este blog para un ejemplo de cómo usarlo:

Cotización de valores enlazados en sentencias de SQL usando psycopg2

Actualización 2019-03-03: se cambió el enlace a archive.org, porque después de nueve años, el original ya no está disponible.