seltsame Fehlermeldung in sqlite3

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Sirius3
User
Beiträge: 9378
Registriert: Sonntag 21. Oktober 2012, 17:20

Sonntag 6. Januar 2019, 23:36

Ein Leerwert ist nicht 0 sondern None. Warum willst Du dann eine 0 schreiben? Und ohne alles auszulesen, weißt Du ja nicht, ob da None oder nicht in der Stelle steht.
Benutzeravatar
__blackjack__
User
Beiträge: 2527
Registriert: Samstag 2. Juni 2018, 10:21

Sonntag 6. Januar 2019, 23:47

Das heisst `None` in Python und nicht `NONE`. Und in der Datenbank wird Python's `None` auf den SQL-Wert `NULL` abgebildet.
“All tribal myths are true, for a given value of 'true'.” – Terry Pratchett, The Last Continent
Benutzeravatar
sparrow
User
Beiträge: 1021
Registriert: Freitag 17. April 2009, 10:28

Montag 7. Januar 2019, 06:50

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.
Cortez
User
Beiträge: 47
Registriert: Montag 31. Dezember 2018, 15:28

Montag 7. Januar 2019, 18:24

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?
__deets__
User
Beiträge: 4804
Registriert: Mittwoch 14. Oktober 2015, 14:29

Montag 7. Januar 2019, 18:37

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.

Code: Alles auswählen

wert = input() # eingabe '0'
if wert == '0':
      wert = None 
insert_into_datenbank(wert)
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.
Benutzeravatar
__blackjack__
User
Beiträge: 2527
Registriert: Samstag 2. Juni 2018, 10:21

Montag 7. Januar 2019, 18:45

@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?
“All tribal myths are true, for a given value of 'true'.” – Terry Pratchett, The Last Continent
Cortez
User
Beiträge: 47
Registriert: Montag 31. Dezember 2018, 15:28

Montag 7. Januar 2019, 19:48

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.
Sirius3
User
Beiträge: 9378
Registriert: Sonntag 21. Oktober 2012, 17:20

Montag 7. Januar 2019, 19:53

Du hast demnach am besten eine Tabelle mit den Feldern Sportler_ID, Sprugnummer, Höhe, wie es __deets__ schon beschrieben hat.
Cortez
User
Beiträge: 47
Registriert: Montag 31. Dezember 2018, 15:28

Montag 7. Januar 2019, 23:27

Ja, aber es soll ja auch die Anzahl der Versuche und die Höhe von jedem Versuch ermittelbar sein.
Sirius3
User
Beiträge: 9378
Registriert: Sonntag 21. Oktober 2012, 17:20

Montag 7. Januar 2019, 23:46

Ist es ja auch. Am besten arbeitest Du erst ein SQL-Tutorial durch, um zu lernen, wie man das dann umsetzt.
Benutzeravatar
sparrow
User
Beiträge: 1021
Registriert: Freitag 17. April 2009, 10:28

Montag 7. Januar 2019, 23:49

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.
Cortez
User
Beiträge: 47
Registriert: Montag 31. Dezember 2018, 15:28

Dienstag 8. Januar 2019, 17:56

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 😊)
Antworten