sqlite3 - eine Zeile mit Hilfe von mehreren Variablen updaten

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Woodz
User
Beiträge: 16
Registriert: Sonntag 11. Dezember 2016, 18:32

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?
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Falls du dein Beispiel per copy paste eingefügt hast, da ist ein Typo drin

Code: Alles auswählen

sql = "UPADTE tabelle
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
mr.mc.mauser
User
Beiträge: 25
Registriert: Sonntag 4. September 2005, 01:18

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
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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>
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten