Python / SQLite3 / Échapper des chaînes

Bonjour,

voilà mon problème :
je veux faire des requêtes SQLite3 en Python 2.6… Et je n’y arrive pas :frowning:

Bon, écrire une requête, ça va.
Faire un SELECT, ça va aussi…

mais maintenant, je veux faire un UPDATE en ne modifiant que certaines valeurs, et naturellement je veux protéger toutes mes chaînes.
Et là, c’est le drame !

Malgré la doc, je comprends vaguement qu’il faut faire
query = “”“UPDATE MYTABLE SET foo=?,bar=? WHERE MYKEY=‘VALUE’ “””
base.execute(query, (“value1”, value2))
base.commit()

Mais ça ne marche pas, je ne suis pas sûr que les chaînes soient bien échappées, je ne sais pas à quoi ressemble la requête finale, je n’ai pas le code d’erreur de la transaction, je ne sais pas ce qui se passe si une valeur vaut None, …

Hé bien ? Tes chaines ne sont pas échappées parce que tu utilises des binding (les ? qui apparaissent sont là pour en témoigner:)).

Sans connaître Python, si ça ne te fait pas d’erreur syntaxique, alors ta requête est “bonne”

Bah normalement, le remplacement des ? par les arguments devrait justement échapper les chaînes, non ?

(et je n’ai aucun moyen de savoir si ma requête est bonne, ni même si elle a été exécutée, c’est quadn même gênant…)

Ce n’est pas échappé. Juste que lu au moment où y en a besoin.

Pour le reste, je ne connais pas Python plus que cela.

Héhé, Salut D9 :wink:

Bon, déjà, tu peux simplifier par
query = "UPDATE MYTABLE SET foo=?,bar=? WHERE MYKEY=‘VALUE’ "
afin d’éviter les ambiguïtés avec les '.

Ensuite, suite à base.execute(query, (“value1”, value2)), ta requête sera du type
UPDATE MYTABLE SET foo=“value1”,bar=? WHERE MYKEY=‘VALUE’
et le ? restant aura la valeur de value2. Ne pas oublier que Python est très fortement typé donc si value2=“toto” tu aura
UPDATE MYTABLE SET foo=“value1”,bar=“toto” WHERE MYKEY=‘VALUE’
et si value2=42, tu aura
UPDATE MYTABLE SET foo=“value1”,bar=42 WHERE MYKEY=‘VALUE’

Le mix “value1” et ‘VALUE’ ne devrait pas trop géner.