2010-11-15 4 views
2

Quelqu'un sait-il si MySQLdb va automatiquement échapper les littéraux de chaîne pour les instructions SQL?Littéraux de chaîne de caractères SQL Python et échappement

Par exemple, je suis en train d'exécuter ce qui suit:

cursor.execute("""SELECT * FROM `accounts` WHERE `account_name` = 'Blah'""") 

Est-ce que cette évasion automatiquement le nom du compte? Ou va-t-il seulement s'échapper si je fais ce qui suit?:

x = 'Blah' 
cursor.execute("""SELECT * FROM `accounts` WHERE `account_name` = %s""", (x)) 

Ou le fera-t-il pour les deux? Quelqu'un peut-il clarifier cela car je ne trouve aucune information à ce sujet.

+0

La notation '(x)' ne sert à rien. – Danosaure

Répondre

2

Il n'y a pas d'échappement dans le premier exemple, il s'agit d'une requête SQL brute. C'est valide, ça marchera, mais évidemment, cela n'a de sens que si vous voulez toujours chercher le compte Blah.

Lorsque vous devez obtenir un compte à partir d'un nom dans une variable, vous aurez besoin de la version paramétrée. Cependant votre exemple peut ne pas fonctionner comme prévu car (x)n'est pas un tuple, c'est juste la valeur x. x dans une séquence de tuple serait (x,). Pour éviter toute confusion, vous préférerez peut-être utiliser la liste [x].

1

L'échappement est uniquement effectué lorsque vous donnez la requête et les données à MySQLdb séparément. C'est comme ça qu'il sait quoi s'échapper. :-)

Ainsi, seul votre 2ème exemple échappera:

x = ('Blah',) 
cursor.execute("""SELECT * FROM `accounts` WHERE `account_name` = %s""", x) 

Notez comment je l'ai changé x à la tuple. C'est ce que MySQLdb attend. Cela a du sens, car vous devrez peut-être transmettre plusieurs variables. Comme:

x = ('Blah','Foo23') 
cursor.execute("""SELECT * FROM `accounts` WHERE `account_name` = %s OR `account_code` = %s""", x) 

Faites-moi savoir si cela répond à votre question.

Bonne chance. :-)

Questions connexes