2010-06-24 3 views
3

Quand j'ai un curseur, je sais que je peux en toute sécurité exécuter une requête comme suit:Python: obtenir échappé chaîne SQL

cur.execute("SELECT * FROM foo WHERE foo.bar = %s", (important_variable,)) 

Est-il possible d'obtenir juste la chaîne en toute sécurité sans exécuter la requête? Par exemple, si important_variable est une chaîne, comme "foo 'bar' \"baz", je veux la façon appropriée se sont échappés d'un:

"SELECT * FROM foo WHERE foo.bar = "foo \'bar\' \"baz" 

(ou quel que soit le Escaping approprié est, je ne suis même pas sûr). J'utilise psycopg, et sqlobject.

+1

Si '' important_variable' est datetime.date (2000,1,1) 'je pense que Claudiu veut une fonction qui renvoie la chaîne' "SELECT * FROM foo OU foo.bar = « 2000-1- 1 '"' – unutbu

+1

En fait il n'y a pas d'échappement impliqué dans ce cas - le pilote envoie l'instruction paramétrée et les arguments séparément. OTOH cochez [psycopg2.extensions.QuotedString] (http://initd.org/psycopg/docs/extensions.html?highlight=escape#psycopg2.extensions.QuotedString) si vous utilisez psycopg2. –

Répondre

4

Regardez la méthode mogrify pour les curseurs - il retournera la chaîne après la liaison variable et montrer une citation qu'il fait

cur.mogrify("SELECT * FROM foo WHERE foo.bar = %s", ("foo 'bar' \"baz",)) 
+0

Notez également que toute approche que vous trouverez sera spécifique au connecteur. L'API de base de données ne définit pas de façon standard de générer des chaînes SQL échappées. Ceci est approprié car les connecteurs ne construisent pas nécessairement toute la chaîne côté client; certains sont capables d'envoyer le modèle de requête et les valeurs au serveur séparément. –

+0

mais .. que se passe-t-il si je veux transformer à la place? – Claudiu

0

poignées SQLObject échapper/lui-même citer, mais si vous souhaitez utiliser cette fonctionnalité:

from sqlobject.converters import sqlrepr 
print(sqlrepr('SELECT * FROM foo WHERE foo.bar = "foo \'bar\' \"baz', 'postgres')) 

Résultat:

'SELECT * FROM foo WHERE foo.bar = "foo ''bar'' "baz' 
Questions connexes