Delete Anweisung in Tkinter/sqlite

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Ynkelonium
User
Beiträge: 6
Registriert: Freitag 6. Mai 2022, 07:47

Guten Tag zusammen,
ich programmiere derzeit eine GUI mit Datenbankzugriff unter Tkinter/sqlite. Im Grundsatz fast fertig bringe ich meine "Delete-Funktion" nicht zum laufen. Folgende Anweisung:

cursor.execute("DELETE FROM Training WHERE tr_da_id = ?", (z[0]))

führt zu folgendem Fehler:

ValueError: parameters are of unsupported type

Bereits überprüft habe ich, dass die Variable z[0] mit dem richtigen Wert versehen ist. Wenn ich die Anweisung zu Testzwecken wie folgt umschreibe funktioniert es:

cursor.execute("DELETE FROM Training WHERE tr_da_id = 12")

Was kann/muss ich tun, um in der Delete-Anweisung erfolgreich mit Variablen zu arbeiten ?
Ergänzend dazu die Frage, kann ich in einer Delete-Anweisung auch Daten in zwei verbundenen Tabellen einer Datenbank auf einmal löschen ?

Vielen Dank bereits jetzt für jeden Tip.
Gruß
Uwe
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was ist denn der Inhalt und Typ(!) von z[0]? Und ich meine das muss ein Tupel sein, da fehlt also auch ein Komma.

cursor.execute("DELETE FROM Training WHERE tr_da_id = ?", (z[0],))
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

`z` ist ein schlechter Variablenname, wie fast alle einbuchstabigen Namen. Auch in Datenbanktabellen haben kryptische Abkürzungen nichts zu suchen, was soll denn tr und da sein? tr ist wohl die Abkürzung für Training, da das aber schon im Tabellennamen steckt, ist so ein Präfix unnötig.

Zum Beantworten der Frage müßten wir wissen, was z, bzw. z[0] für ein Typ ist.
Wenn man raten müßte, ist z[0] eine Zahl, und execute erwartet eine Liste/Tuple, etc.
Ynkelonium
User
Beiträge: 6
Registriert: Freitag 6. Mai 2022, 07:47

Hallo zusammen,
und danke für eure Bemühungen. Die Kritik an meinen kryptischen Bezeichnungen kann ich verstehen und akzeptieren. Allerdings ist das mein persönlicher Programmierstil und solange ich die Programme im wesentlichen für meinen eigenen Gebrauch schreibe, komme ich damit klar.
Die Delete- Anweisung funktioniert inzwischen (fragt mich aber bitte nicht warum, ich könnte es nicht erklären). Hier die nun funktionierende Version:

cursor.execute("DELETE FROM Training WHERE tr_da_id=? and tr_id=?", (z[0], s[0]))

Bei den Variablen z und s handelt es sich um globale Listen, die ich im Wechsel mit Daten aus Datenbankabfragen befülle und für die Anzeige bzw. Bearbeitung der Daten im Programm nutze (z = Zeitdaten, s = Sachdaten).
Soweit so gut, allerdings habe ich jetzt die gleiche Fehlermeldung bei folgender Select-Anweisung:

cursor.execute("SELECT tr_id from Training WHERE tr_da_id=?", (z[0]))

Und egal, was ich bisher mit formalen Änderungen etc. probiert habe, es läuft nicht. Dabei ist der Inhalt von z[0] laut einer Printausgabe vor dem Einstieg ins execute korrekt. Noch Ideen ??

Gruß und einen schönen Sonntag
Uwe
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und auch da fehlt schon wieder das Komma. Habe ich doch schon geschrieben. Und gezeigt. Und dich um weitere Informationen gebeten, die ich auch nirgends sehe.

Was die Bezeichnungen angeht: du postest hier Code, von dem du von *anderen* erwartest, dass die den verstehen. Das es also nur fuer deinen Gebrauch ist, stimmt so also schonmal nicht. Aus persoenlicher Erfahrung weiss man als Entwickler, dass jemand anderes uebrigens auch man selbst in wenigen Wochen oder Monaten ist. Es waere darum glaube ich immer noch eine gute Idee, die besser zu bennen. Bleibt natuerlich dein Ding. So wie es meins bleibt, ob ich mir einen Verhau aus schlecht lesbarem Code antue :twisted:

Nachtrag: dass es ploetzlich funktioniert, lag uebrigens daran, dass du mit einem mal ein Tupel baust, weil es zwei Werte in die Abfrage schaffen muessen. Wie gesagt. Es fehlt das Komma.
Antworten