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:
<code class="python">for item in self.inventory_names: self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", item) self.cursor.close()</code>
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 der Nichtübereinstimmung führt.
<code class="python">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)""")</code>
Ironischerweise ist das Ersetzen von „?“ mit einem weniger sicheren „%s“ löst das Problem:
<code class="python">for item in self.inventory_names: self.cursor.execute("SELECT weight FROM Equipment WHERE name = '%s'" % item) self.cursor.close()</code>
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:
<code class="python">self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", [item])</code>
Diese Änderung stellt sicher, dass die Parameterersetzung wie vorgesehen funktioniert. Stellen Sie immer sicher, dass der zweite an Cursor.execute() übergebene Parameter der angegebenen Anzahl von Bindungen in der SQL-Anweisung entspricht.
Das obige ist der detaillierte Inhalt vonWie löst man Probleme bei der Parameterersetzung in SQLite bei der Verwendung von Sequenzen oder Strings?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!