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?
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.
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])
Psycopg2 n'a pas une telle méthode. Il a une extension 151930920 "pour adapter les valeurs Python aux objets ISQLQuote, et ces objets ont une méthode getquoted()
pour retourner les valeurs PostgreSQL compatibles.
voir ce blog pour un exemple d'utilisation: citant des valeurs liées dans des déclarations SQL en utilisant psycopg2
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], )