Python 3 SQLite3 – Falsche Anzahl von Bindungen

Ich verstehe, es gibt viele Fragen auf Stack Overflow über diesen Fehler, aber ich habe versucht, viele Lösungen und offensichtlich haben sie alle gescheitert.

Hier ist eine Liste:

Sqlite3.ProgrammingError: Falsche Anzahl der gelieferten Bindungen. Die aktuelle Anweisung verwendet 1, und es werden 74 geliefert

SQLite-Parameter-Substitutionsproblem

Sqlite3.ProgrammingError: Falsche Anzahl der gelieferten Bindungen

Lesen aus der Datenbank mit SQLite und Python: Falsche Anzahl der gelieferten Bindung

SQLite Python Insert – Falsche Anzahl der gelieferten Bindungen

Ich versuche, einen Benutzernamen und Hash-Passwort (erstellt von PassLib – https://pythonhosted.org/passlib/ ) in einer SQLite3-Datenbank zu speichern. Diese werden in den Variablen "targetusername" bzw. "password" gespeichert. Mein Problem ist, dass, wenn ich tatsächlich versuchen, diese 2 Variablen in eine Tabelle einer Datenbank namens "Passwörter" einfügen, gibt es diesen Fehler:

Incorrect number of bindings supplied. The current statement uses 1, and there are 11 supplied. 

Hier ist ein Beispiel dafür, was targetusername und Passwort speichern würde:

 targetusername = "user4884072" password = "$5$rounds=535000$ySH31paWMjEDCUUY$jdrBVGsoYnSMkdVBtjCaxQy2f0g3MX1Wts4vSYz7m.4" 

Diese Zeile gibt den Fehler:

 c.executemany("INSERT INTO {tn} ({idf}, {cn}) VALUES(targetusername, %s" % str(password).\ format(tn="Passwords")) 

Es wurde mehrfach geändert, um zu versuchen, das Problem zu beheben (was anscheinend verursacht wird, wie Python Variablen speichert), aber hier ist was es ursprünglich war:

 c.execute("INSERT OR IGNORE INTO {tn} ({idf}, {cn}) VALUES (targetusername, password)".\ format(tn="Passwords", idf="Username", cn="Password")) 

One Solution collect form web for “Python 3 SQLite3 – Falsche Anzahl von Bindungen”

Verwenden Sie c.execute() , nicht c.executemany() , um eine einzelne c.executemany() einzufügen. Dies ist die unmittelbare Ursache für den Fehler, den Sie erleben.

Darüber hinaus verwenden Sie keine Stringsersetzung, verwenden Sie parametrisierte Abfragen. Hier ist ein komplettes Arbeitsbeispiel:

 import sqlite3 connection = sqlite3.connect(':memory:') # in memory database c = connection.cursor() c.execute('create table Passwords (Username text, Password text)') targetusername = "user4884072" password = "$5$rounds=535000$ySH31paWMjEDCUUY$jdrBVGsoYnSMkdVBtjCaxQy2f0g3MX1Wts4vSYz7m.4" c.execute('insert into Passwords (Username, Password) values (?, ?)', (targetusername, password)) print c.execute('select * from Passwords').fetchall() 

Ausgabe:

 [(U'user4884072 ', u' $ 5 $ Runden = 535000 $ ySH31paWMjEDCUUY $ jdrBVGsoYnSMkdVBtjCaxQy2f0g3MX1Wts4vSYz7m.4 ')]

In dem Code, den du gepostet hast, gibt es keinen Sinn, Werte für die Tabellen- oder Spaltennamen zu ersetzen, also einfach in die Abfragezeichenfolge wie gezeigt.

Hierbei handelt es sich um eine parametrisierte Abfrage, bei der die API die Werte für Benutzername und Passwort in die Abfrage an den angegebenen Stellen einfügt ? . Dies ist sicherer als die Verwendung von String-Substitution, weil die DB-API weiß, wie man richtig und sicher entweichen die Werte an sie übergeben, und dies vermeidet SQL-Injection-Angriffe auf Ihren Code.

Und es verwendet executemany() execute() anstatt executemany() da es nur eine Zeile von Daten eingefügt wird.

  • GoogleAppEngineLauncher: Datenbank-Datenträger-Image ist fehlerhaft
  • Python Sqlite3: INSERT INTO Tabelle VALUE (Wörterbuch geht hier)
  • Python / SQLite3: kann nicht begehen - keine Transaktion ist aktiv
  • Kompilieren Sie Python 3.4 mit sqlite3
  • Wie erstelle ich eine SELECT-Anweisung mit einer Liste als Parameter?
  • Lesen von sqlite3 entfernten Datenbanken
  • Warum ist SQLAlchemy mit sqlite 25 mal langsamer einsetzbar als mit sqlite3 direkt?
  • Warum mein Python sieht nicht pysqlite?
  • So verwenden Sie den Vakuumbefehl von SQLite 3 in Python
  • Sqlite: check reader / writer lock
  • Gleichzeitiges Schreiben mit sqlite3
  • Python ist die beste Programmiersprache der Welt.