2010-09-29 11 views
16

Ich übergebe einige Werte in ein Postgres-Zeichenfeld mit Psycopg2 in Python. Einige der String-Werte enthalten Perioden, Schrägstriche, Anführungszeichen usw.psycopg2 entspricht mysqldb.escape_string?

Mit MySQL Ich würde nur die Zeichenfolge entkommen mit

MySQLdb.escape_string(my_string) 

Gibt es ein Äquivalent für psycopg2?

Antwort

2

Psycopg2 hat keine solche Methode. Es verfügt über extension zum Anpassen von Python-Werten an ISQLQuote-Objekte, und diese Objekte verfügen über eine getquoted()-Methode zum Zurückgeben von PostgreSQL-kompatiblen Werten.

diesen Blogs für ein Beispiel, wie es zu benutzen: Quoting bound values in SQL statements using psycopg2

+4

Beachten Sie, dass der Mann es falsch ist: was er erhalten werden kann tun will die 'mogrify()' Methode (http: // initd.org/psycopg/docs/cursor.html#cursor.mogrify) – piro

+0

Danke @piro, das sieht einfacher aus, obwohl es wahrscheinlich für die Verwendung von vollständigen SQL-Ausdrücken oder Abfragen gedacht ist, nicht j ust individuelle Werte zu zitieren. –

+0

Beachten Sie auch, dass mogrify, wie auch execute, nicht mit ausgehenden Tabellennamen arbeitet, sondern nur mit Parametern. – a1an

22

Flüchten ist automatisch, Sie müssen nur anrufen:

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

(Beachten Sie, dass der Python-Operator% ist nicht verwendet) und die Werte werden korrekt maskiert.

Sie können manuell eine Variable entkommen extensions.adapt(var) verwenden, aber dies würde die Verbindung Codierung fehleranfällig und nicht halten zu berücksichtigen sein: es ist nicht in regelmäßigem Client-Code verwendet werden soll.

+1

Im gleichen Sinne wie 'adapt()' könnte man explizit ein bestimmtes Adaptionsprotokoll-Objekt verwenden; z.B. 'QuotedString (r" O'Reilly "). Getquoted()' siehe [die Dokumente] (http://initd.org/psycopg/docs/extensions.html#sql-adaptation-protocol-objects) – rakslice

0

Im unwahrscheinlichen Fall verwenden, die Abfrage-Parameter nicht ausreichend sind, und Sie müssen Strings selbst zu entkommen, Sie Postgres escaped string constants zusammen mit Python verwenden können repr (weil Python-Regeln für die Flucht nicht-ASCII und Unicode-Zeichen sind die gleichen wie Postgres ist):

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