Python: Datensätze verwalten
Neuen Datensatz anlegen
► SQLite-Dokumentation: INSERT
► Python-Dokumentation: lastrowid
Um einen neuen Datensatz anzulegen, wird die SQL-Anweisung INSERT verwendet.
- import sqlite3
- con = sqlite3.connect("Python/mydatabase.db")
- dbcursor = con.cursor()
- personen = []
- personen.append(["Hans", "Meier", "21.04.1987", "10001", "Musterstadt", "Hafenstraße", "34", "Hamburg"])
- personen.append(["Monika", "Müller", "03.11.1956", "10002", "Musterdorf", "Am Acker", "3", "München"])
- personen.append(["Paul", "Schmidt", "17.09.1972", "10001", "Musterstadt", "Bahnhofstraße", "129", "Stuttgart"])
- personen.append(["Paula", "Lehmann", "11.06.1999", "10002", "Musterdorf", "Dorfstraße", "17", "Berlin"])
- for person in personen:
- sql = "INSERT INTO `adressen` (`vorname`, `nachname`, `geburtsdatum`, `plz`, `ort`, `strasse`, `hausnummer`, `geburtsort`) VALUES (" \
- "'" + person[0] + "', " \
- "'" + person[1] + "', " \
- "'" + person[2] + "', " \
- "'" + person[3] + "', " \
- "'" + person[4] + "', " \
- "'" + person[5] + "', " \
- "'" + person[6] + "', " \
- "'" + person[7] + "')"
- dbcursor.execute(sql)
- con.commit()
- print(dbcursor.lastrowid) # gibt die ID des letzten Eintrags zurück
- con.close()
► Python-Dokumentation: commit
Die Funktion con.commit() in Zeile 23 ist notwendig, um die entsprechende SQL-Anweisung ›dauerhaft‹ auszuführen, da die Ausführung sonst nur während der aktuellen Verbindung zur Datenbank erhalten bleibt. Dies gilt für INSERT, UPDATE und DELETE.
Folgendes Beispiel veranschaulicht dieses Verhalten:
- import sqlite3
- con = sqlite3.connect("Python/mydatabase.db")
- dbcursor = con.cursor()
- dbcursor.execute("INSERT INTO `adressen` (`vorname`, `nachname`, `geburtsdatum`, `plz`, `ort`, `strasse`, `hausnummer`, `geburtsort`) VALUES ('Otto', 'Krause', '21.07.1923', '10001', 'Musterstadt', 'Hauptstraße', '47', 'Dresden')")
- #con.commit() # wird zunächst nicht ausgeführt, da die Funktion auskommentiert ist
- dbcursor.execute("SELECT * FROM `adressen`")
- for datensatz in dbcursor:
- print(datensatz) # der neue Eintrag ist hier noch vorhanden
- con.close() # Datenbankverbindung wird beendet
- print()
- con = sqlite3.connect("Python/mydatabase.db") # Datenbankverbindung wird erneut hergestellt
- dbcursor = con.cursor()
- dbcursor.execute("SELECT * FROM `adressen`")
- for datensatz in dbcursor:
- print(datensatz) # der neue Eintrag ist hier nicht mehr vorhanden
- con.close()
Datensatz abfragen
► SQLite-Dokumentation: SELECT
Um die Datensätze einer Datenbanktabelle abzufragen, wird die SQL-Anweisung SELECT verwendet.
- import sqlite3
- con = sqlite3.connect("Python/mydatabase.db")
- dbcursor = con.cursor()
- dbcursor.execute("SELECT * FROM `adressen`")
- for datensatz in dbcursor:
- print(datensatz)
- con.close()
Sollen nur bestimmte Felder abgefragt werden, gibt man diese anstelle des Asterisken * an.
- import sqlite3
- con = sqlite3.connect("Python/mydatabase.db")
- dbcursor = con.cursor()
- dbcursor.execute("SELECT `vorname`, `nachname` FROM `adressen`")
- for datensatz in dbcursor:
- print(datensatz)
- con.close()
Über das Schlüsselwort WHERE lässt sich die Abfrage auf bestimmte Datensätze einschränken, die der angegebenen Bedingung entsprechen. Im Beispiel werden die Datensätze gesucht, deren Feld ort den Wert Musterdorf enthält.
- import sqlite3
- con = sqlite3.connect("Python/mydatabase.db")
- dbcursor = con.cursor()
- dbcursor.execute("SELECT * FROM `adressen` WHERE `ort` = 'Musterdorf'")
- for datensatz in dbcursor:
- print(datensatz)
- con.close()
Über das Schlüsselwort LIKE lässt sich ein Datensatz auswählen, der dem angegebenen Begriff ähnelt. Der Platzhalter % steht dabei für eine beliebige Anzahl von Zeichen. Der Platzhalter _ steht für genau ein Zeichen.
- import sqlite3
- con = sqlite3.connect("Python/mydatabase.db")
- dbcursor = con.cursor()
- dbcursor.execute("SELECT * FROM `adressen` WHERE `nachname` LIKE '%er'") # findet Meier und Müller
- for datensatz in dbcursor:
- print(datensatz)
- print()
- dbcursor.execute("SELECT * FROM `adressen` WHERE `vorname` LIKE 'pa%'") # findet Paul und Paula
- for datensatz in dbcursor:
- print(datensatz)
- print()
- dbcursor.execute("SELECT * FROM `adressen` WHERE `nachname` LIKE 'M__er'") # findet Meier aber nicht Müller
- for datensatz in dbcursor:
- print(datensatz)
- con.close()
Über das Schlüsselwort ORDER BY kann das Ergebnis einer Abfrage sortiert werden. Der Zusatz DESC (descending) steht dabei für eine absteigende Sortierung. Der Zusatz ASC (ascending) steht für eine aufsteigende Sortierung, kann aber weggelassen werden, da normalerweise ohnehin aufsteigend sortiert wird.
- import sqlite3
- con = sqlite3.connect("Python/mydatabase.db")
- dbcursor = con.cursor()
- dbcursor.execute("SELECT * FROM `adressen` ORDER BY `nachname` DESC")
- for datensatz in dbcursor:
- print(datensatz)
- con.close()
Über das Schlüsselwort LIMIT kann der Bereich eingegrenzt werden, für den eine Abfrage erfolgen soll. Der erste angegebene Wert gibt den ersten Datensatz an, bei dem die Abfrage beginnt. Der zweite Wert steht für die maximale Anzahl der abzufragenden Datensätze.
In folgendem Beispiel sollen 20 Datensätze ab Datensatz 10 abgefragt werden.
- import sqlite3
- con = sqlite3.connect("Python/mydatabase.db")
- dbcursor = con.cursor()
- dbcursor.execute("SELECT * FROM `adressen` LIMIT 10,20")
- for datensatz in dbcursor:
- print(datensatz)
- con.close()
Datensatz ändern
► SQLite-Dokumentation: UPDATE
Um Werte eines Datensatzes zu verändern, wird die SQL-Anweisung UPDATE verwendet.
- import sqlite3
- con = sqlite3.connect("Python/mydatabase.db")
- dbcursor = con.cursor()
- dbcursor.execute("UPDATE `adressen` SET `vorname` = 'Ilse', `nachname` = 'Schultz' WHERE `id` = '1'")
- con.commit()
- # Datensätze anzeigen
- print()
- dbcursor.execute("SELECT * FROM `adressen`")
- for datensatz in dbcursor:
- print(datensatz)
- con.close()
Datensatz kopieren
Um einen Datensatz zu kopieren, kann folgende Methode verwendet werden:
- import sqlite3
- def copy_row(dbt, id, cursor):
- columns = ""
- cursor.execute("PRAGMA table_info(`" + dbt + "`)")
- for column in cursor:
- if column[1] != "id":
- columns += "`" + column[1] + "`, "
- columns = columns[:-2]
- sql = "INSERT INTO `" + dbt + "` (" + columns + ") SELECT " + columns + " FROM `" + dbt + "` WHERE `id` = '" + str(id) + "'"
- cursor.execute(sql)
- con.commit()
- con = sqlite3.connect("Python/mydatabase.db")
- dbcursor = con.cursor()
- copy_row("adressen", 3, dbcursor) # erzeugt eine Kopie des Datensatzes mit der ID 3
- # Datensätze anzeigen
- print()
- dbcursor.execute("SELECT * FROM `adressen`")
- for datensatz in dbcursor:
- print(datensatz)
- con.close()
Datensatz löschen
► SQLite-Dokumentation: DELETE
Um einen Datensatz zu löschen, wird die SQL-Anweisung DELETE verwendet.
- import sqlite3
- con = sqlite3.connect("Python/mydatabase.db")
- dbcursor = con.cursor()
- dbcursor.execute("DELETE FROM `adressen` WHERE `id` = '2'")
- con.commit()
- # Datensätze anzeigen
- print()
- dbcursor.execute("SELECT * FROM `adressen`")
- for datensatz in dbcursor:
- print(datensatz)
- con.close()