Seite 1 von 1

sqlite3 - eine Zeile mit Hilfe von mehreren Variablen updaten

Verfasst: Donnerstag 16. August 2018, 02:59
von Woodz
Hallo Leute.

Ich versuche aktuell in meiner SQlite3 Datenbank eine ganze Zeile via UPDATE zu aktualisieren und habe dafür folgenden Code versucht:

Code: Alles auswählen


    sql = "UPADTE tabelle SET Spalte1 = ?,  Spalte2 = ?, Spalte3 = ? WHERE Feld1 = ? AND Feld2 = ? AND Feld3 = ?;"

    parameter  = (wert1, wert2, wert3, wert4, wert5, wert6)

    cursor.execute(sql, parameter)
    
    
Das Problem ist nun, dass die korrekte Anzahl der Variablen in dem SQL-Statement nicht erkannt wird. Ich bekomme folgende Fehlermeldung:

Code: Alles auswählen

    (<class 'sqlite3.ProgrammingError'>, ProgrammingError('Incorrect number of bindings supplied. The current statement uses 3, and there are 6 supplied.',)
Wie bekomme ich es hin, das alle Variablen für das sql-statement erkannt werden?

Re: sqlite3 - eine Zeile mit Hilfe von mehreren Variablen updaten

Verfasst: Donnerstag 16. August 2018, 10:28
von __blackjack__
@Woodz: Das Problem kann ich nicht nachvollziehen. Bei mir passiert das nur wenn die Anzahl der Platzhalter tatsächlich nicht mit der Anzahl der Werte übereinstimmt.

Edit: Zeig mal ein minimales aber komplettes, ausführbares Beispiel, das jeder hier nachvollziehen kann.

Re: sqlite3 - eine Zeile mit Hilfe von mehreren Variablen updaten

Verfasst: Donnerstag 16. August 2018, 13:41
von ThomasL
Falls du dein Beispiel per copy paste eingefügt hast, da ist ein Typo drin

Code: Alles auswählen

sql = "UPADTE tabelle

Re: sqlite3 - eine Zeile mit Hilfe von mehreren Variablen updaten

Verfasst: Mittwoch 19. Dezember 2018, 10:13
von mr.mc.mauser
Ich hatte das gleiche Problem
es liegt am:

Code: Alles auswählen

WHERE Feld1 = ? AND Feld2 = ? AND Feld3 = ?;
Mit dem ? kann man nur die Felder die eingefügt werden setzten alles andere geht nicht. (zumindest ist es bei mir so)
Habe das auch nur durch Try and Error herausgefunden.

Die Fehlermeldung besagt ja das die anzahl der Parameter nicht stimmt zum "Befehl" UPADTE kam es erst gar nicht.
Das hätte zu einem near "UPADTE": syntax error: UPADTE geführt
So müsste es Funktionieren (Quick and Dirty)

Code: Alles auswählen

    sql = "UPDATE tabelle SET Spalte1 = ?,  Spalte2 = ?, Spalte3 = ? WHERE Feld1 = "+str(wert4)+" AND Feld2 = "+str(wert5)+" AND Feld3 = "+str(wert6)+";"
    parameter  = (wert1, wert2, wert3)
    cursor.execute(sql, parameter)
Gruß
mc.mauser

Re: sqlite3 - eine Zeile mit Hilfe von mehreren Variablen updaten

Verfasst: Mittwoch 19. Dezember 2018, 10:31
von __blackjack__
@mr.mc.mauser: Das ist definitiv falsch! Vor allem auch gefährlich, denn man sollte nie Werte per Zeichenkettenformatierung in SQL-Anweisungen einsetzen.

Edit: Beweis:

Code: Alles auswählen

In [10]: import sqlite3

In [11]: con = sqlite3.connect(':memory:')

In [12]: cur = con.cursor()

In [13]: cur.execute('UPDATE tabelle SET spalte = ? WHERE feld = ?', [42, 23])
---------------------------------------------------------------------------
OperationalError                          Traceback (most recent call last)
<ipython-input-13-4f725c9b1d09> in <module>()
----> 1 cur.execute('UPDATE tabelle SET spalte = ? WHERE feld = ?', [42, 23])

OperationalError: no such table: tabelle

In [14]: cur.execute('CREATE TABLE tabelle (spalte INTEGER, feld INTEGER)')
Out[14]: <sqlite3.Cursor at 0x7fa5d7d59ce0>

In [15]: cur.execute('UPDATE tabelle SET spalte = ? WHERE feld = ?', [42, 23])
Out[15]: <sqlite3.Cursor at 0x7fa5d7d59ce0>