Heim > Backend-Entwicklung > Python-Tutorial > Wie löst man Probleme bei der Parameterersetzung in SQLite bei der Verwendung von Sequenzen oder Strings?

Wie löst man Probleme bei der Parameterersetzung in SQLite bei der Verwendung von Sequenzen oder Strings?

DDD
Freigeben: 2024-10-19 15:28:30
Original
561 Leute haben es durchsucht

How to Resolve Parameter Substitution Issues in SQLite When Using Sequences vs. Strings?

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage