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
Delete Anweisung in Tkinter/sqlite
`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.
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.
-
- 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
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
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
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.
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
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.