web-dev-qa-db-fra.com

Un bon moyen d'échapper aux guillemets dans une chaîne de requête de base de données?

J'ai essayé toutes sortes de modules Python et ils s'échappaient soit trop, soit de manière incorrecte. Quel est le meilleur moyen que vous avez trouvé pour échapper des guillemets (", ') en Python?

28
Jonathan Prior

Si cela fait partie d'une requête de base de données, vous devriez pouvoir utiliser un Instruction SQL paramétrée .

En plus d'échapper à vos citations, cela traitera de tous les caractères spéciaux et vous protégera des attaques par injection SQL .

26
Dave Webb

Utilisez json.dumps.

>>> import json
>>> print json.dumps('a"bc')
"a\"bc"
21
eddie_c

Le moyen simple et standard d’échapper aux chaînes et de convertir d’autres objets en forme programmatique consiste à utiliser la fonction repr () intégrée (). Il convertit un objet dans la représentation dont vous auriez besoin pour le saisir avec un code manuel.

Par exemple.:

s = "I'm happy I am \"here\" now"
print repr(s)
>>  'I\'m happy I am "here" now'

Pas de hacks bizarres, il est intégré et fonctionne pour la plupart des buts.

7
GregD

Répondez pour l'ancien fil, mais le meilleur moyen manque encore ici ..

Si vous utilisez psycopg2, il est exécuté -method a buildin échappé.

cursor.execute("SELECT column FROM table WHERE column=%s AND column2=%s", (value1, value2))

Notez que vous donnez deux arguments pour exécuter la méthode (chaîne et Tuple) au lieu d'utiliser l'opérateur% de Python pour modifier la chaîne. 

Réponse volée à partir d'ici: psycopg2 équivalent de mysqldb.escape_string?

2
ex4

Si vous utilisez psycopg2, il existe une méthode pour échapper des chaînes: psycopg2.extensions.adapt() See Comment citer explicitement une valeur de chaîne (Python DB API/Psycopg2) pour la réponse complète

2
EMP

Les guillemets simples trios encapsuleront aisément les guillemets simples souvent utilisés dans les requêtes SQL:

c.execute('''SELECT sval FROM sdat WHERE instime > NOW() - INTERVAL '1 days' ORDER BY instime ASC''')
1
Roy

Les guillemets triple-double sont les meilleurs pour échapper:

"string"
1
Miles

Pour résoudre un problème plus générique, j’ai un programme dans lequel je devais stocker le jeu de caractères any dans un fichier plat, délimité par des tabulations. De toute évidence, avoir des onglets dans le «set» posait problème.

Au lieu de output_f.write (str), j’ai utilisé output_f.write (repr (str)), qui a résolu mon problème . Il est plus lent à lire, car j’ai besoin d’éval () l’entrée lorsque je le lis, mais dans l’ensemble, cela rend le code plus propre car je n’ai plus besoin de vérifier les cas marginaux.

0
robertlayton