sqlite INSERT nur wenn Eintrag in Tabelle noch nicht existiert

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
mhard666
User
Beiträge: 8
Registriert: Dienstag 22. September 2020, 13:14

Hallo allerseits,

ich befasse mich erstmals mit der Verwendung von Datenbanken - konkret sqlite3 - in Python. Sorry, wenn die Frage zu banal sein sollte...

Ich möchte den Inhalt einer verschachtelten Liste in eine Tabelle einer sqlite3-DB importieren. Format der Listen:

[('bla', 'blubb', 'IP-Adresse', 'Kommentar'), ('bla', 'blubb', 'nächste IP-Adresse', 'Kommentar'),...]

Die Felder bla und blubb brauche ich nicht in der Datenbank. Die IP-Adresse soll nur einmal in der Datenbank vorhanden sein. Das heißt, wenn die IP-Adresse schon mal in die DB geschrieben wurde, soll sie nicht mehr importiert werden.

Aktuell denke ich darüber nach, die Tabelle auszulesen (das Feld mit der IP-Adresse genügt ja), und dann jeden zu importierenden Eintrag gegen die Liste mit den ausgelesenen Adressen zu prüfen. Ist er nicht enthalten, werden IP-Adresse und Kommentar in die DB geschrieben.

Geht das vielleicht auch einfacher?

Danke.

VG mhard666
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hast keine verschachtelte Liste, sondern eine Liste mit Tuple (was ja auch ganz passend ist).
Datenbanken kennen unique-constraints (https://www.sqlite.org/lang_createtable ... onstraints) um zu verhindern, dass mehrere Einträge mit gleichem Inhalt geschrieben werden können. Das mußt Du also nicht selbst implementieren.
mhard666
User
Beiträge: 8
Registriert: Dienstag 22. September 2020, 13:14

Hallo Sirius3,

hat funktioniert (wenn man das richtige SQL-Statement weiß):

Code: Alles auswählen

    cursor.execute("""
                        INSERT OR IGNORE INTO ip_addresses (str_address, comment)
                        VALUES (?,?)
                        """, 
                        (address, comment)
    )
Danke.

VG mhard666
Antworten