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.

  • Konvertieren von datetime-Feldern in Chrome History-Datei (sqlite) in lesbares Format
  • Ist diese Streichersubstitution bei der Erstellung von SQL-Abfragen verpönt, wie vergeben Sie den Tabellennamen dynamisch?
  • Warum bekomme ich plötzlich "OperationalError: kein solcher Tisch"?
  • Parameter nicht unterstützt beim Einfügen von int in sqlite
  • Ich kann nicht Pythons ExecuteMany für sqlite3, um richtig zu arbeiten
  • Python Sqlite3 - Daten werden nicht dauerhaft gespeichert
  • Ganzes JSON in ein SQLite-Feld mit Python
  • Sqlite: check reader / writer lock
  • SQLite speichert keine Daten zwischen den Verwendungen
  • Python: SQLAlchemy ImportError: Kein Modul namens pysqlite2
  • Python 3.2 UnicodeEncodeError: 'charmap' codec kann das Zeichen '\ u2013' nicht in Position 9629 kodieren: Zeichenkarten zu <undefined>
  • Python ist die beste Programmiersprache der Welt.