2010-09-29 9 views
16

Estoy pasando algunos valores en un campo de caracteres postgres usando psycopg2 en Python. Algunos de los valores de cadena contienen puntos, barras, citas, etc.psycopg2 equivalente a mysqldb.escape_string?

Con MySQL que acababa de escapar de la cadena con

MySQLdb.escape_string(my_string) 

¿Hay un equivalente de psycopg2?

Respuesta

2

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

Ver este blog para un ejemplo de cómo usarlo: Quoting bound values in SQL statements using psycopg2

+4

en cuenta que el chico no está mal: lo que quiere hacer se puede obtener utilizando el 'mogrify()' método (http: // initd.org/psycopg/docs/cursor.html#cursor.mogrify) – piro

+0

Gracias @piro, que parece más fácil, aunque probablemente esté destinado a ser utilizado en expresiones SQL completas o consultas, no j ust valores individuales para citar. –

+0

Observe también que mogrify, como también execute, no maneja los nombres de las tablas de escape, solo los parámetros. – a1an

22

Escapar es automática, sólo hay que llamar:

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

(aviso de que el operador de pitón% es no usado) y los valores serán escapados correctamente.

se puede escapar manualmente utilizando una variable extensions.adapt(var), pero esto sería propenso a errores y no mantener en cuenta la codificación de conexión: es supone no para ser utilizado en el código de cliente regular.

+1

En la misma línea que 'adapt()', puede usar un objeto de protocolo de adaptación particular explícitamente; p.ej. 'QuotedString (r" O'Reilly "). Getquoted()' ver [los documentos] (http://initd.org/psycopg/docs/extensions.html#sql-adaptation-protocol-objects) – rakslice

0

En el caso improbable de que consultan los parámetros no son suficientes y que necesita para escapar de las cadenas a sí mismo, puede utilizar Postgres escaped string constants junto con el pitón de repr (porque las reglas de Python para escapar no ASCII y Unicode personajes son los mismos que Postgres de):

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],)