2010-09-29 3 views
16

Je passe certaines valeurs dans un champ de caractères postgres en utilisant psycopg2 en Python. Certaines des valeurs de chaîne contiennent des périodes, des barres obliques, des citations, etc.psycopg2 équivalent de mysqldb.escape_string?

Avec MySQL Je venais juste échapper la corde avec

MySQLdb.escape_string(my_string) 

Y at-il un équivalent pour psycopg2?

Répondre

2

Psycopg2 n'a pas une telle méthode. Il a un extension pour adapter les valeurs Python aux objets ISQLQuote, et ces objets ont une méthode getquoted() pour renvoyer des valeurs compatibles avec PostgreSQL.

Voir ce blog pour un exemple de comment l'utiliser: Quoting bound values in SQL statements using psycopg2

+4

Notez que le gars il est faux: ce qu'il veut faire peut être obtenu en utilisant la méthode 'mogrify()' (http: // initd.org/psycopg/docs/cursor.html#cursor.mogrify) – piro

+0

Merci @piro, cela semble plus facile, bien qu'il soit probablement destiné à être utilisé sur des expressions SQL ou des requêtes ust valeurs individuelles à citer. –

+0

Notez également que mogrify, comme également exécuté, ne gère pas les noms de tables qui échappent, seuls les paramètres. – a1an

22

Escaping est automatique, il vous suffit d'appeler:

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

(avis que l'opérateur python% est pas utilisé) et les valeurs seront correctement échappées.

Vous pouvez échapper à la main en utilisant une variable extensions.adapt(var), mais ce serait sujette aux erreurs et ne pas tenir compte de l'encodage de connexion: il est pas censé être utilisé dans le code client régulier.

+1

Dans le même esprit que 'adapter()', vous pouvez explicitement utiliser un objet protocole d'adaptation particulier; par exemple. 'QuotedString (r" O'Reilly "). Getquoted()' voir [les docs] (http://initd.org/psycopg/docs/extensions.html#sql-adaptation-protocol-objects) – rakslice

0

Dans le cas improbable où les paramètres de requête ne sont pas suffisantes et vous avez besoin pour échapper à vous-même les chaînes, vous pouvez utiliser Postgres escaped string constants avec Python repr (parce que les règles de Python pour échapper à des caractères non-ascii et unicode sont les mêmes que ceux 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],) 
Questions connexes