Substitution de paramètres Python SQLite par des caractères génériques dans LIKE

j'essaie d'utiliser une requête paramétrée avec la bibliothèque Sqlite de Python comme suit:

self.cursor.execute("select string from stringtable where string like '%?%' and type = ?", (searchstr,type))

mais l' ? à l'intérieur de l'génériques ne sont pas évaluées me laissant avec cette erreur:

"sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 2 supplied."

j'ai aussi essayé d'utiliser la tagged version de l'interrogation avec:

like '%:searchstr%' et dans la liste ayant {"searchstr":searchstr...

mais quand je le fais, la requête s'exécute mais ne renvoie jamais de résultats, même si"like '%a%'"... retourner des centaines de résultats comme il se doit

des suggestions s'il vous plaît?

29
demandé sur MPelletier 2010-06-24 00:25:23

1 réponses

les guillemets protègent soit ? ou :name d'être pris comme un support de place -- ils sont pris au pied de la lettre. Vous devez placer les signes de pourcentage autour de la chaîne que vous passez, et utiliser le placeholder simple sans guillemets. I. e.:

self.cursor.execute(
  "select string from stringtable where string like ? and type = ?",
  ('%'+searchstr+'%', type))

notez que ni l'un ni l'autre ? est entre guillemets, et c'est exactement comme il devrait l'être pour eux d'être pris comme des espaces réservés.

57
répondu Alex Martelli 2010-06-23 20:40:21