Viele Datensätze in Datenbank speichern
Im letzten Kapitel haben wir genau einen neuen Datensatz in unserer SQLite-Datenbank gespeichert. Dazu haben wir folgenden Python-Code erstellt:
import sqlite3
verbindung = sqlite3.connect("datenbank/geburtstage.db")
zeiger = verbindung.cursor()
nachname = "Schiller"
vorname = "Friedrich"
geburtstag = "10.11.1759"
zeiger.execute("""
INSERT INTO personen
VALUES (?,?,?)
""",
(vorname, nachname, geburtstag)
)
verbindung.commit()
verbindung.close()
Wenn uns allerdings mehrere Daten vorliegen, dann möchten wir diese so effektiv wie möglich in unserer Datenbank speichern können.
Als Erstes benötigen wir die Daten selber. Dazu bieten sich natürlich Listen an. Bisher haben wir einzelne Variablen verwendet, was sehr schnell ab einer gewissen Menge an verschiedenen Variablen sehr unübersichtlich wird. Daher nutzen wir eine Liste, in der wir in einer vorgegebenen Reihenfolge unsere Namen und Geburtstagsdaten abspeichern:
personendaten = ("Heinrich Hermann Robert", "Koch", "11.12.1843")
Diese Liste kann jetzt einfach unsere SQL-Anweisung execute
übergeben werden.
personendaten = ("Heinrich Hermann Robert", "Koch", "11.12.1843")
zeiger.execute("""
INSERT INTO personen
VALUES (?,?,?)
""", personendaten)
Was passiert aber, wenn wir eine geschachtelte Liste haben – sprich eine Liste mit vielen Personendaten?
beruehmtheiten = [('Georg Wilhelm Friedrich', 'Hegel', '27.08.1770'),
('Johann Christian Friedrich', 'Hölderlin', '20.03.1770'),
('Rudolf Ludwig Carl', 'Virchow', '13.10.1821')]
Wenn wir nun die geschachtelte Liste unserer SQL-Anweisung execute
übergeben, erhalten wir eine Fehlermeldung:
sqlite3.InterfaceError: Error binding parameter 0 - probably unsupported type.
Geschachtelte Listen per SQL ausführen lassen: executemany
Und jetzt kommt es. Es gibt mehr als die execute
-Anweisung. Über die SQL-Anweisung executemany
werden auch geschachtelte Listen auf einen Rutsch abgearbeitet.
import sqlite3
verbindung = sqlite3.connect("datenbank/geburtstage.db")
zeiger = verbindung.cursor()
beruehmtheiten = [('Georg Wilhelm Friedrich', 'Hegel', '27.08.1770'),
('Johann Christian Friedrich', 'Hölderlin', '20.03.1770'),
('Rudolf Ludwig Carl', 'Virchow', '13.10.1821')]
zeiger.executemany("""
INSERT INTO personen
VALUES (?,?,?)
""", beruehmtheiten)
verbindung.commit()
Es muss aber eine geschachtelte Liste sein. Diese kann aber auch nur einen Datensatz enthalten wie im folgenden Beispiel:
personendaten = [("Heinrich Hermann Robert", "Koch2", "11.12.1843")]
Im folgenden Kapitel wollen wir auch mal schauen, was in unserer Datenbank angekommen ist. Dazu lesen wir die Datenbank aus und zeigen die Inhalte an.