Fehlerbehebung bei Parameterersetzungsproblemen in SQLite
Sind Probleme bei der Verwendung der Parameterersetzung in SQLite3 mit Python aufgetreten? Hier ist eine ausführliche Untersuchung und eine Lösung.
Um SQL-Injections zu verhindern, wurde die Parameterersetzung durch „?“ ist ratsam. Bei Verwendung dieses Ansatzes kann jedoch ein Fehler auftreten. Zum Beispiel mit dem folgenden Code:
for item in self.inventory_names:
self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", item)
self.cursor.close()
Der Fehler „sqlite3.ProgrammingError: Falsche Anzahl der bereitgestellten Bindungen“ tritt auf, was darauf hinweist, dass die Anweisung eine Bindung angibt, während acht bereitgestellt werden. Dieses Problem ist auf die anfängliche Erstellung der Datenbanktabelle zurückzuführen. Das für die Datenbankerstellung verantwortliche Modul enthält acht Bindungen, was zu einer Nichtübereinstimmung führt.
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)""")
Ironischerweise ist das Ersetzen von '?' mit einem weniger sicheren „%s“ löst das Problem:
for item in self.inventory_names:
self.cursor.execute("SELECT weight FROM Equipment WHERE name = '%s'" % item)
self.cursor.close()
Der Grund für dieses Paradoxon liegt in der Art und Weise, wie Cursor.execute() seinen zweiten Parameter akzeptiert. Anstelle einer einzelnen Zeichenfolge wird eine Sequenz erwartet, aber Sie übergeben eine Zeichenfolge der Länge acht.
Um dieses Problem zu beheben, passen Sie den Code wie folgt an:
self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", [item])
Diese Änderung stellt sicher, dass die Parameterersetzung wie beabsichtigt funktioniert. Stellen Sie immer sicher, dass der zweite an Cursor.execute() übergebene Parameter der angegebenen Anzahl von Bindungen in der SQL-Anweisung entspricht.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3