Dépannage des problèmes de substitution de paramètres dans SQLite
Vous rencontrez des problèmes lors de l'utilisation de la substitution de paramètres dans SQLite3 avec Python ? Voici une enquête approfondie et une résolution.
Pour tenter d'empêcher les injections SQL, la substitution de paramètres à l'aide de « ? » est conseillé. Cependant, une erreur peut survenir lors de l'utilisation de cette approche. Par exemple, avec le code suivant :
for item in self.inventory_names:
self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", item)
self.cursor.close()
L'erreur « sqlite3.ProgrammingError : nombre incorrect de liaisons fournies » se produit, indiquant que l'instruction spécifie une liaison, alors que huit sont fournies. Ce problème provient de la création initiale de la table de base de données. Le module responsable de la création de la base de données contient huit liaisons, ce qui entraîne une incompatibilité.
cursor.execute("""CREATE TABLE Equipment
(id INTEGER PRIMARY KEY,
name TEXT,
price INTEGER,
weight REAL,
info TEXT,
ammo_cap INTEGER,
availability_west TEXT,
availability_east TEXT)""")
Ironiquement, en remplaçant '?' avec un '%s' moins sécurisé résout le problème :
for item in self.inventory_names:
self.cursor.execute("SELECT weight FROM Equipment WHERE name = '%s'" % item)
self.cursor.close()
La raison de ce paradoxe réside dans la manière dont Cursor.execute() accepte son deuxième paramètre. Au lieu d'une seule chaîne, il attend une séquence, mais vous transmettez une chaîne de longueur huit.
Pour résoudre ce problème, ajustez le code comme suit :
self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", [item])
Cette modification garantit que la substitution de paramètre fonctionne comme prévu. Assurez-vous toujours que le deuxième paramètre transmis à Cursor.execute() correspond au nombre de liaisons spécifié dans l'instruction SQL.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3