80 votes

Problème de substitution de paramètre SQLite

À l'aide de SQLite3 avec Python 2.5, je suis en train de parcourir une liste et tirez le poids d'un article de la base de données basé sur le nom de l'élément.

J'ai essayé d'utiliser le "?" paramètre de substitution proposé pour empêcher les injections SQL, mais ça ne fonctionne pas. Par exemple, lorsque j'utilise:

for item in self.inventory_names:
    self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", item)
    self.cursor.close()

J'obtiens l'erreur:

sqlite3.ProgrammingError: nombre Incorrect de fixations fournies. L'instruction en cours utilise 1, et il y a 8 fournies.

Je crois que c'est en quelque sorte causé par la création initiale de la base de données; le module que j'ai faite qui crée réellement le DB n'avons 8 liaisons.

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)""")

Cependant, lorsque j'utilise le moins sûr "%s" de substitution pour chaque nom d'élément, il fonctionne très bien. Comme suit:

for item in self.inventory_names:
    self.cursor.execute("SELECT weight FROM Equipment WHERE name = '%s'" % item)
    self.cursor.close()

Je ne peux pas comprendre pourquoi il pense que j'ai 8 bindins quand je suis le seul à en appeler un. Comment puis-je résoudre ce problème?

167voto

ddaa Points 19102

La méthode Cursor.execute() attend une séquence en tant que second paramètre. Vous fournissez une chaîne de 8 caractères.

Utilisez plutôt le formulaire suivant:

 self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", [item])
 

Référence de la bibliothèque Python 13.13.3: Objets curseur sqlite3.

34voto

jgtumusiime Points 161

L'argument de l' cursor.execute qui représente les valeurs que vous avez besoin inséré dans la base de données doit être un n-uplet (séquence). Cependant, considérons cet exemple et de voir ce qui se passe:

>>> ('jason')
'jason'

>>> ('jason',)
('jason',)

Le premier exemple correspond à une chaîne, au lieu; donc la bonne façon de représenter une valeur unique n-uplet est que dans la deuxième évaluation. De toute façon, le code ci-dessous pour corriger votre erreur.

self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", (item,))

En donnant l' cursor.execute de la valeur des arguments comme des chaînes de caractères(qui est ce que vous faites) des résultats de la première évaluation dans l'exemple et les résultats dans l'erreur que vous obtenez.

2voto

Blauohr Points 3279

avez-vous essayé cela? :

 for item in self.inventory_names:
    t = (item,)
    self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", t)
    self.cursor.close()
 

cursor.execute () attend une séquence (liste, tuple) comme second paramètre. (-> ddaa)

1voto

kjikaqawej Points 11

Citation (est que les parens veux dire?) l' ? avec parens semble fonctionner pour moi. J'ai continué à essayer avec (littéralement) '?', mais j'ai continué à obtenir

ProgrammingError: nombre Incorrect de fixations fournies. L'instruction en cours utilise 0, et il y a 1 fourni.

Lorsque j'ai fait:

SÉLECTIONNEZ fait à PARTIR de petits faits OÙ clés COMME (?)

au lieu de:

SÉLECTIONNEZ fait à PARTIR de petits faits OÙ clés COMME le '?'

Il a travaillé.

Ce n'est pas la version 2.6 de python chose?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X