EINFÜHRUNG |
Einfache Datenbanken können sich lokal auf einem PC befinden und von einer einzelnen Person bedient werden, beispielsweise für die Verwaltung von Musik-CDs oder Büchern. Meist sind Datenbanken aber über das Internet für viele Benutzer gleichzeitig zugänglich (Online-Datenbanken). Dabei handelt es sich um ein Client-Server-System mit einem Datenbankserver (auch Host genannt) und mehreren verteilten Clients. Die Datenkommunikation erfolgt wie bei Webservern mit dem TCP-Protokoll über einen TCP-Port (z.B. für MySQL 3306 oder für Derby 1527). Für den Datenaustausch läuft auf dem Client ein spezifisches Anwendungsprogramm, das in irgend einer höheren Programmiersprache geschrieben ist, z.B. in Python.
Vielfach wird der Client nicht direkt, sondern indirekt über einen Webserver mit dem Datenbankserver verbunden. Auf dem Client läuft dann lediglich einer der bekannten Webbrowser. Das spezifische Programm für den Datenaustausch mit dem Datenbankserver befindet sich in diesem Fall auf dem Webserver und muss ebenfalls in einer dafür geeigneten Programmiersprache geschrieben sein (häufig PHP). In beiden Fällen sind die Verfahren ähnlich und setzen gute Programmierkenntnisse im Zusammenhang mit Datenbanken voraus, die du hier erarbeiten wirst [mehr...
Der Datenbankserver ist typisch auch über das Internet mit dem Webserver |
DEIN EIGENER DATENBANKSERVER |
Der Zugang zu vorhandenen Datenbankservern über das Internet ist starken Sicherheitsbeschränkungen unterworfen, da man vermeiden will, dass unerlaubt Daten gespeichert oder verändert werden. Aus diesen Gründen installierst du auf deinem PC einen eigenen Datenbankserver, den du entweder vom PC selbst, aber auch von anderen Clients innerhalb eines LAN/WLAN verwenden kannst. Gewöhnlich muss man sich für den Zugriff auf eine Datenbank mit einem Usernamen/Passwort authentifizieren [mehr...
Vom Internet her ist der Zugang gewöhnlich durch Firewalls blockiert. Im Folgenden verwendest du als Datenbankserver Derby, ein kostenfreies Produkt der Apache-Organisation, die auch den weltberühmten Apache-Webserver entwickelt. (Du könntest aber auch irgend eine andern Datenbank-Software einsetzen, beispielsweise MySQL.) Für die Installation von Derby gehst du gemäss folgender Anleitung vor:
Als Alternative kannst du den Server mit den Dateien startderby.bat (für Windows) oder startderby (für Linux/Mac, du musst die Datei noch ausführbar machen) starten, die du im Verzeichnis Lib findest. Erstelle einen Link auf diese Dateien, damit ein Mausklick genügt. Der so gestartete Server ist nur auf dem lokalen PC (localhost) sichtbar. Um ihn nach Aussen zu öffnen, musst du ihn unter Angabe der IP-Adresse deines PCs starten. Ist diese beispielsweise 10.1.1.123 mit java -jar derbynet.jar start -h 10.1.1.123 oder mit der Startdatei und der IP-Adresse als Parameter: startderby 10.1.1.123. Der Datenbankserver kann mehrere verschiedene Datenbanken (databases) gleichzeitig verwalten. Da du nachfolgend ein Reservationssystem für den Konzertsaal im frei erfundenen Konzertlokal Casino erstellen wirst, wählst du als Datenbanknamen casino und die Username/Passwort-Kombination admin/solar. Die Datenbank-Programmierung ist fast identisch mit dem, was du mit SQLite gelernt hast. Du verwendest wieder einen with-Block mit der Funktion connect(), die nun allerdings mehrere Parameter hat. Der String serverURL enthält eine Angabe über den verwendeten Datenbanktyp (hier derbyserver) und eine IP-Adresse des Hosts, auf dem der Datenbankserver läuft. Zudem musst du den Namen der Datenbank und einen Usernamen sowie ein Passwort angeben. Ist die Datenbank noch nicht vorhanden, so wird sie beim ersten Aufruf von connect() erstellt. Um die Sitzplatz-Reservationen im Casinosaal für ein bestimmtes Konzert zu verwalten, erzeugst du eine Tabelle reservation. Als Felder wählst du die Sitznummer seat, booked mit dem Buchstaben N oder Y und eine Kundennummer cust, über die der Sitzplatz-Besteller identifiziert wird (hier noch nicht verwendet). from dbapi import * serverURL = "derbyserver:localhost" #serverURL = "derbyserver:10.1.1.123" dbname = "casino" username = "admin" password = "solar" tbl = "reservation" with connect(serverURL, dbname, username, password) as con: cursor = con.cursor() sql = "CREATE TABLE " + tbl + "(seat INTEGER, booked CHAR(1), cust INTEGER)" cursor.execute(sql) con.commit() print("Table created")
|
MEMO |
Läuft das Programm problemlos durch, so hast du auch gleich eine Bestätigung, dass du den Datenbankserver erfolgreich eingerichtet hast. Kriegst du eine Fehlermeldung, so lies dieses Kapitel nach einmal sorgfältig durch und versuche jeden Schritt zu wiederholen. Es ist für Datenbanken typisch, dass sich die SQL-Befehle erst dann in der Datenbank auswirken, nachdem commit() aufgerufen wird. Damit wird sicher gestellt, dass mehrstufige Datenbank-Transaktion als eine Einheit betrachtet werden, die immer als Ganzes oder unter Abgabe einer Fehlermeldung gar nicht ausgeführt wird. Falls du das Programm ausführst, wenn die Tabelle bereits existiert, so bricht das Programm mit einer Fehlermeldung ab. Weiter unten siehst du, wie du die Tabelle wieder löschen kannst. |
DATEN IN DIE TABELLE EINFÜGEN |
In der nächsten Phase willst du die Tabelle mit Initialisierungsdaten füllen, also alle Sitze als frei kennzeichnen und die Kundennummer 0 eintragen. Dazu verwendest du den dir bekannten SQL-INSERT Befehl, beispielsweise für den Sitz mit der Nummer 1 und dem Kunde 0: INSERT INTO reservation VALUES (1, 'N', 0) from dbapi import * serverURL = "derbyserver:localhost" #serverURL = "derbyserver:10.1.1.123" dbname = "casino" username = "admin" password = "solar" tbl = "reservation" with connect(serverURL, dbname, username, password) as con: cursor = con.cursor() for seatNb in range(1, 31): sql = "INSERT INTO " + tbl + " VALUES (" + str(seatNb) + ",'N',0)" cursor.execute(sql) con.commit() print("Table initialized")
|
MEMO |
Führst du das Programm zweimal aus, so wird jeder Datensatz ein zweites Mal eingefügt. |
DATEN AUS EINER TABELLE AUSLESEN |
Du bist jetzt natürlich gespannt, ob sich die Daten tatsächlich in der Tabelle befinden. Heutige Softwaresysteme sind allerdings so stabil, dass du davon ausgehen kannst, dass ohne eine Fehlermeldung die Datenbank-Transaktion tatsächlich erfolgreich war. Zum Auslesen einer Tabelle verwendest du den dir bekannten SQL -Befehl SELECT * FROM reservation Mit dem Stern (Wildcard) verlangst du, dass alle Datensätze ausgelesen werden. Nach der Ausführung mit execute(), kannst du die erhaltenen Records mit der Cursormethode fetchall() herausholen. Dabei wird eine Liste zurückgeben, in der die einzelnen Records als Tuples (eine unveränderliche Liste) enthalten sind. Darin kannst du die einzelnen Felder mit Indizes auslesen. Wichtig ist oft die totale Anzahl der Datensätze, die der SELECT-Befehl geliefert hat. Du kriegst die Anzahl Records aus der Variablen rowcount. from dbapi import * serverURL = "derbyserver:localhost" #serverURL = "derbyserver:10.1.1.123" dbname = "casino" username = "admin" password = "solar" tbl = "reservation" with connect(serverURL, dbname, username, password) as con: cursor = con.cursor() sql = "SELECT * FROM " + tbl cursor.execute(sql) result = cursor.fetchall() # list of tuples for record in result: print("seatNb:", record[0], " booked:", record[1]," cust:", record[2])
|
MEMO |
Neben fetchall() stehen dir für das Auslesen der Daten auch fetchmany(n) und fetchone() zur Verfügung. Bei jedem Aufruf einer der fetch-Methoden wird der Cursor sozusagen wie ein Zeiger um die Anzahl zurückgegebener Records vorwärts geschoben (daher der Name Cursor) und der nächste Aufruf von fetchall(), fetchmany() oder fetchone() liefert die Records von der neuen Stelle an. Ist der Cursor am Ende der Tabelle angelangt, so liefern diese Methoden eine leere Liste bzw. den Wert None zurück. Bei einem SELECT-Befehl ist die Zeile con.commit() nicht notwendig. |
TABELLE LÖSCHEN |
Du beendest die Übung, indem du die eben erzeugte Tabelle wieder löschst. In der Datenbanksprache nennt man dies eine Drop-Operation (Fallenlassen). Der entsprechende SQL-Befehl lautet: DROP TABLE reservation Nachher hat deine Datenbank casino keine benutzerspezifischen Tabellen mehr. from dbapi import * serverURL = "derbyserver:localhost" #serverURL = "derbyserver:10.1.1.123" dbname = "casino" username = "admin" password = "solar" tbl = "reservation" with connect(serverURL, dbname, username, password) as con: cursor = con.cursor() sql = "DROP TABLE " + tbl cursor.execute(sql) con.commit() print("Table removed")
|
MEMO |
Die Datenbank mit dem Namen pythondb bleibt auch nach dem Löschen der Tabelle erhalten. Es handelt sich um mehrere Dateien im Unterverzeichnis pythondb des Verzeichnisses, in das du die Derby-Software kopiert hast (hier also um Lib/pythondb). Willst du alle Spuren der Übung entfernen, so kannst du das Verzeichnis pythondb löschen. |
Als Datenbank-Administrator möchtest du deine Datenbanken verwalten, ohne dabei selbst programmieren zu müssen. Dazu stehen dir verschiedene Verwaltungstools zur Verfügung, die du im Internet findest. Oft sind diese allerdings nicht gratis. Man unterscheidet dabei zwischen Kommandozeilen-Tools und solchen mit einer grafischen Benutzeroberfläche. Während Profis sich oft in einer Command-Shell wohl fühlen, bevorzugen Gelegenheitsnutzer GUI-Programme. Ein weit bekanntes Programm mit einer grafischen Benutzeroberfläche, das mehrere Datenbanktypen unterstützt und gratis ist, heisst DBeaver und kann von http://dbeaver.jkiss.org heruntergeladen werden. |
AUFGABEN |
|