psycopg2 équivalent de mysqldb.échapper à la chaîne?

je passe quelques valeurs dans un champ de caractères postgrès en utilisant psycopg2 en Python. Certaines des valeurs de la chaîne contiennent des périodes, des slashs, des guillemets, etc.

avec MySQL je viens d'échapper à la corde avec

MySQLdb.escape_string(my_string)

Existe-t-il un équivalent pour psycopg2?

17
demandé sur AP257 2010-09-29 20:30:59

4 réponses

S'échapper est automatique, il suffit d'appeler:

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

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

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

24
répondu piro 2010-10-06 10:06:21

Comme piro a dit, s'échapper est automatique. Mais il y a aussi une méthode pour retourner le sql complet échappé par psycopg2 en utilisant le curseur .mogrify (sql, [params])

6
répondu notbad.jpeg 2017-05-23 10:30:08

dans le cas peu probable où les paramètres de requête ne sont pas suffisants et que vous devez vous échapper vous-même des chaînes, vous pouvez utiliser Postgres constantes de chaîne avec repr de Python (parce que les règles de Python pour échapper aux caractères non ascii et unicode sont les mêmes que celles 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], )
1
répondu David Wolever 2015-05-14 22:51:25