seltsame Fehlermeldung in sqlite3
- __blackjack__
- User
- Beiträge: 13103
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Das heisst `None` in Python und nicht `NONE`. Und in der Datenbank wird Python's `None` auf den SQL-Wert `NULL` abgebildet.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Wenn du dynamisch Spalten an eine SQL-Tabelle einfügen möchtest, ist entwededer das Design der Dstenbank falsch oder du benutzt das falsche Werkzeug.
Nur weil die Dinger "Tabellen" heißen, hat das nichts mit Tabellenkalkulation zu tun.
Nur weil die Dinger "Tabellen" heißen, hat das nichts mit Tabellenkalkulation zu tun.
Ok, ich glaube, wir reden irgendwie aneinander vorbei
Nehmen wir an, der User gibt für den ersten Datensatz die Werte 1,2,3,4,5 ein. Dann steht in der Tabelle 1 2 3 4 5. Weil eben alle Werte eingeben wurden und die Liste voll ist.
So, für den zweiten Datensatz gibt er dann ein: 1, 2, , 4, 5. Für die Spalte3 hat er also keinen Wert eingeben, aber das Skript schreibt dafür eine 0, damit die Liste richtig befüllt ist. In der Tabelle steht dann also 1,2,0,4,5
Für den dritten Datensatz wird dann z.B. 1,2,3, , , eingegeben. In der Tabelle steht daher 1,2,3,0,0.
Wie krieg ich die Nullen dann aus der Tabelle raus, dass die Spalten dann überall da, wo mein Skript die 0 übertrug, wirklich leer sind? Weil so ist ja die einzige Möglichkeit, da anders, wie gesagt, in Beispiel 3 z.B. ein put of index Error oder sowas kommt?
Ich muss das Ganze so umständlich machen, weil man ja dynamisch keine Spalten dazufügen kann. Dann muss man eben soviel Spalten anlegen, dass die maximale Anzahl an Werten, die der User eingeben könnte, nicht überschritten wird.
Oder gibts da doch irgendwas, was einfacher und effektiver ist?
Nehmen wir an, der User gibt für den ersten Datensatz die Werte 1,2,3,4,5 ein. Dann steht in der Tabelle 1 2 3 4 5. Weil eben alle Werte eingeben wurden und die Liste voll ist.
So, für den zweiten Datensatz gibt er dann ein: 1, 2, , 4, 5. Für die Spalte3 hat er also keinen Wert eingeben, aber das Skript schreibt dafür eine 0, damit die Liste richtig befüllt ist. In der Tabelle steht dann also 1,2,0,4,5
Für den dritten Datensatz wird dann z.B. 1,2,3, , , eingegeben. In der Tabelle steht daher 1,2,3,0,0.
Wie krieg ich die Nullen dann aus der Tabelle raus, dass die Spalten dann überall da, wo mein Skript die 0 übertrug, wirklich leer sind? Weil so ist ja die einzige Möglichkeit, da anders, wie gesagt, in Beispiel 3 z.B. ein put of index Error oder sowas kommt?
Ich muss das Ganze so umständlich machen, weil man ja dynamisch keine Spalten dazufügen kann. Dann muss man eben soviel Spalten anlegen, dass die maximale Anzahl an Werten, die der User eingeben könnte, nicht überschritten wird.
Oder gibts da doch irgendwas, was einfacher und effektiver ist?
Du *musst* ueberhaupt keine 0 in die DB schreiben. Denn das ist eine gueltige Zahl, warum soll die NICHT eingebbar sein? Und wenn es ok ist, dass sie von Seitens des Benutzers signalisiert, dass eben keine Eingabe erfolgen soll (statt dem viel sinnvolleren "nur-return-druecken") - dann ist das immer noch losgeloest davon, was DU in deinem Skript damit dann machst.
Und None ist das, was dann in der Datenbank NULL wird. NULL. Nicht 0. NULL kann man auch benutzen bei String-Spalten, oder allen anderen. Das hat NICHTS mit der Zahl 0 zu tun, sondern ist ein spezieller Wert, der sagt "hier ist nix". Und den setzt man von Python aus mit dem dort ebenso definierten Spezial-Wert None, und None ist auch was man bekommt, wenn man eine Zeile abfragt, in der ein NULL-Wert in der Datenbank steht.
Last but not least: natuerlich gibt es etwas, das effektiver ist: das anlegen einer 1:n-Tabelle, in der du pro Eintrag genau *EINE* Zahl ablegst. Damit bist du bei der Anzahl der Zahlen deiner Liste nicht durch eine feste Anzahl an Tabellen-Spalten festgelegt.
Code: Alles auswählen
wert = input() # eingabe '0'
if wert == '0':
wert = None
insert_into_datenbank(wert)
Last but not least: natuerlich gibt es etwas, das effektiver ist: das anlegen einer 1:n-Tabelle, in der du pro Eintrag genau *EINE* Zahl ablegst. Damit bist du bei der Anzahl der Zahlen deiner Liste nicht durch eine feste Anzahl an Tabellen-Spalten festgelegt.
- __blackjack__
- User
- Beiträge: 13103
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Cortez: Da wo Du denkst Du musst 0 eintragen wenn der Benutzer keinen Wert angegeben hat, musst Du nicht 0 eintragen sondern `None`. Und daran kannst Du dann beim auslesen auch wieder erkennen, das der Benutzer da keinen Wert eingetragen hat, denn Du bekommst da auch wieder `None` zurück. Der Wert `None` vom Typ `NoneType` wird in Python genau für das gleiche verwendet wie der Wert NULL in SQL. Und nur damit wir nicht wirklich aneinander vorbeireden, NULL ist in SQL ein Wert der genau so geschrieben wird N U L L, das ist nicht die Zahl 0 als Wort und gross geschrieben. NULL ≠ 0.
Ansonsten klingt das mit der Spaltenanzahl komisch. Wenn der Benutzer für einen Datensatz dynamisch viele Werte angeben kann, dann sind das keine Spalten sondern Zeilen, also eigene Datensätze, mit einer Datensatz-ID die kennzeichnet um welchen ursprünglchen Datensatz es sich handelt und einer Spaltennummer, und ggf. noch einer zusätzlichen künstlichen ID wenn man keinen zusammengesetzten Primärschlüssel haben möchte.
Welches konkrete Problem versuchst Du hier eigentlich gerade zu lösen?
Ansonsten klingt das mit der Spaltenanzahl komisch. Wenn der Benutzer für einen Datensatz dynamisch viele Werte angeben kann, dann sind das keine Spalten sondern Zeilen, also eigene Datensätze, mit einer Datensatz-ID die kennzeichnet um welchen ursprünglchen Datensatz es sich handelt und einer Spaltennummer, und ggf. noch einer zusätzlichen künstlichen ID wenn man keinen zusammengesetzten Primärschlüssel haben möchte.
Welches konkrete Problem versuchst Du hier eigentlich gerade zu lösen?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Ok, danke dir erstmal. Das mit dem none-Wert habe ich, glaube ich, nun ein biss hen Begriffen.
Das Problem ist folgendes: Es geht um eine Tabelle, die Ergebnisse von Sportlern misst. Jeder Datensatz ist sozusagen ein Sportler und jede Spalte ein Versuch. Also wenn ein Sportler z.B. beim Hochsprung an der 1,40 m Marke scheitert, ist der Wettkampf vorbei und er hat keine Versuche mehr. Wenn er aber immer weiter kommt, braucht er auch immer mehr Versuche, eben bis er nicht mehr über die Stange kommt. Und da man im Vorfeld nicbt vorausseheb kann, wer am Ende wieviele Versuche hat, wäre das gut, wenn man das dynamisch machen könnte.
Hoffe, ich habe das ein bisschen verständlich erklären können.
Das Problem ist folgendes: Es geht um eine Tabelle, die Ergebnisse von Sportlern misst. Jeder Datensatz ist sozusagen ein Sportler und jede Spalte ein Versuch. Also wenn ein Sportler z.B. beim Hochsprung an der 1,40 m Marke scheitert, ist der Wettkampf vorbei und er hat keine Versuche mehr. Wenn er aber immer weiter kommt, braucht er auch immer mehr Versuche, eben bis er nicht mehr über die Stange kommt. Und da man im Vorfeld nicbt vorausseheb kann, wer am Ende wieviele Versuche hat, wäre das gut, wenn man das dynamisch machen könnte.
Hoffe, ich habe das ein bisschen verständlich erklären können.
Du siehst eine Tabelle in einer relationale Datenbank wie eine Tabelle in einer Tabellenkalkulation.
Nur weil beides gleich heißt, ist es nicht identisch.
Du hast eine Tabelle, die den Sportler repräsentiert.
Eine Tabelle, die die Sportart repräsentiert.
Eine Tabelle, die den Wettkampf repräsentiert.
Eine Tabelle, die die Versuche repräsentiert.
Die Tabelle für die Versuche hat dann in etwa folgende Spalten:
Fremdschlüssel Sportler
Fremdschlüssel Wettkampf
Fremdschlüssel Sportart
Integer versuchsnummer
Double ergebnis
Für jeden Versuch gibt es dann eine Eintrag in die Versuche-Tabelle.
Stichwörter um das Thema zur vertiefen: Relationen in einer Datenbank und Normalisierung.
Nur weil beides gleich heißt, ist es nicht identisch.
Du hast eine Tabelle, die den Sportler repräsentiert.
Eine Tabelle, die die Sportart repräsentiert.
Eine Tabelle, die den Wettkampf repräsentiert.
Eine Tabelle, die die Versuche repräsentiert.
Die Tabelle für die Versuche hat dann in etwa folgende Spalten:
Fremdschlüssel Sportler
Fremdschlüssel Wettkampf
Fremdschlüssel Sportart
Integer versuchsnummer
Double ergebnis
Für jeden Versuch gibt es dann eine Eintrag in die Versuche-Tabelle.
Stichwörter um das Thema zur vertiefen: Relationen in einer Datenbank und Normalisierung.
Ja, das mit dem SQL-Lite Tutuorial ist vielleicht eine gute Idee. Ich merke gerade, dass ich von der Antwort, die mir sparrow gegeben habe, nur Bahnhof verstehe.
Das Tutorial, das ich auf Youtube durch habe, ist dann scheinbar doch nicht so ausführlich.
Hätte jemand einen Vorschlag für ein gutes Tutorial? (wenn möglich so, dass es auch Normalsterbliche verstehen )
Das Tutorial, das ich auf Youtube durch habe, ist dann scheinbar doch nicht so ausführlich.
Hätte jemand einen Vorschlag für ein gutes Tutorial? (wenn möglich so, dass es auch Normalsterbliche verstehen )