Insert Befehl mit möglichen Null Werten

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
gabber
User
Beiträge: 8
Registriert: Dienstag 5. Januar 2021, 18:51

Hallo zusammen,

ich habe ein Problem mit meiner SQLite Datenbank beim Einfügen der Daten. Ich lese Daten aus zwei DBF-Dateien aus und möchte diese Daten in eine Datenbank speichern. Ich habe nur das Problem das manchmal die Felder in der DBF leer sind. Hier möchte ich in die Datenbank "NULL" einfügen.
Mein Code zum Einfügen sieht aktuell so aus:

Code: Alles auswählen

        cursor.execute("INSERT INTO Pilze (Vollname, Gattung, Art, Familie, Ordnung, Roteliste, Anmerkung, "
                           "Bild) VALUES ({0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}) ".format(mushroomFullname, mushroomGenre, mushroomSpecies, mushroomFamily,
                        mushroomOrder if mushroomOrder else null, mushroomRedList if mushroomRedList else null, mushroomNote if mushroomNote else null, mushroomPicture))
        database.commit()
Weiter oben im Code steht null = "NULL" also bitte deswegen nicht verwirren lassen. Wenn ich jetzt das ganze ausführe steigt er mir schonmal aus, da natürlich in mushroomFullname sowas z.b drin steht: "Boletus edulis Bulliard".
Dann habe ich gedacht gut, dann schreibst halt folgendes:

Code: Alles auswählen

        cursor.execute("INSERT INTO Pilze (Vollname, Gattung, Art, Familie, Ordnung, Roteliste, Anmerkung, "
                           "Bild) VALUES ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}', '{7}') ".format(mushroomFullname, mushroomGenre, mushroomSpecies, mushroomFamily,
                        mushroomOrder if mushroomOrder else null, mushroomRedList if mushroomRedList else null, mushroomNote if mushroomNote else null, mushroomPicture))
        database.commit()
Jetzt habe ich in meiner Datenbank zwar die Werte drin stehen, aber anstatt einen "NULL"-Werte habe ich das Wort "NULL" drin stehen. Ich hab es auch schon mit %s und '%s' versucht und hab das gleiche Problem. Daher meine Frage:

Wie kann ich mögliche "NULL"-Werte in das SQL-Statement einbauen?
Bzw. wie geht man bei sowas richtig vor?


Mögliche "NULL"-Werte können im Statement folgende sein:
  • mushroomOrder
    mushroomRedList
    musrhoomNote
    mushroomPicture (immer "NULL", da aktuell nicht in der DBF hinterlegt, aber wird für später benötigt)
Folgendes kann z.B in den Sachen drin stehen, wo auch NULL sein können:
mushroomOrder = "Russulales"
mushroomRedlist = "2/3"
mushroomNote = "vgl. Boletus bulbosus ..."

Danke für eure Hilfe.

Grüße Gabber
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Man formatiert keine Variablen in SQL-Statements hinein, sondern benutzt Platzhalter, so wie es in der Dokumentation ja auch gezeigt wird.

Code: Alles auswählen

        cursor.execute("INSERT INTO Pilze (Vollname, Gattung, Art, Familie, Ordnung, Roteliste, Anmerkung, Bild) VALUES (?, ?, ?, ?, ?, ?, ?, ?)",
                [mushroom_fullname, mushroom_genre, mushroom_species, mushroom_family, mushroom_order , mushroom_redlist, mushroom_note, mushroom_picture])
        database.commit()
Variablennamen schreibt man komplett klein.
gabber
User
Beiträge: 8
Registriert: Dienstag 5. Januar 2021, 18:51

Danke für dein Hinweis. Ich habe den Code jetzt so abgeändert wie du es gezeigt hast. Leider trägt er mir immer noch den String "NULL" ein und nicht den SQL NULL Wert. Eine Idee wie ich das händeln könnte?

Edit: Danke habe es herausgefunden. Ich muss anstelle von null = "NULL" einfach None hinschreiben. SQL interpetiert das dann wohl als NULL.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn Da "NULL" drin steht, dann schreibst DU "NULL" in die Datenbank. Mach das einfach nicht, ich gehe davon aus, dass Z.B. mushroom_picture = None gilt und das wird automatisch zu SQL-NULL.
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Wieder was gelernt. Danke.
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
saltbayfour
User
Beiträge: 1
Registriert: Samstag 12. Juni 2021, 10:36
Kontaktdaten:

Ich habe jetzt den Code geändert, wie Sie ihn gezeigt haben. Leider trägt er für mich immer noch den String "NULL" ein und nicht den SQL-NULL-Wert. Irgendeine Idee, wie ich damit umgehen könnte?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du solltest den Code schon zeigen. Wie sonst sollen wir das beurteilen koennen?
LukeNukem
User
Beiträge: 232
Registriert: Mittwoch 19. Mai 2021, 03:40

saltbayfour hat geschrieben: Samstag 12. Juni 2021, 13:34 Ich habe jetzt den Code geändert, wie Sie ihn gezeigt haben. Leider trägt er für mich immer noch den String "NULL" ein und nicht den SQL-NULL-Wert. Irgendeine Idee, wie ich damit umgehen könnte?
Die meisten (mir bekannten) Datenbanktreiber unter Python folgen dem Python Enhancement Proposal (PEP) 249 [1] und wandeln Python-Datentypen automatisch korrekt in SQL-Datentypen um. Das Äquivalent zum NULL-Symbol in anderen Programmiersprachen wie C oder C++ heißt in Python None.

Darüber hinaus möchte ich anmerken, daß ".format()" bei Datenbanken keine gute Idee sind. Datenbanktreiber, die PEP249 folgen, sind selbst in der Lage, den korrekten Datentyp der Spalte zu ermitteln und ihn passend zu quoten, sofern das notwendig ist. Dazu solltst Du allerdings anstelle von

Code: Alles auswählen

'INSERT INTO Pilze (Vollname, Gattung, Art) VALUES ({}, {}, {},)'
anstelle ".format()" benutzen und Dich auf die Quoting-Funktionalität des Datenbanktreibers verlassen, also:

Code: Alles auswählen

cursor.execute( 'INSERT INTO Pilze (Vollname, Gattung, Art) VALUES ({?, ?, ?)', ('Rübennase', 'Nasen', None))

[1] https://www.python.org/dev/peps/pep-0249/
Antworten