deutsch     english     français     Drucken

 

9.5 ONLINE-DATENBANKEN

 

 

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.

 
Direkte Verbindung
 
Indirekte Verbindung

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
verbunden, beide Server können aber auch auf derselben Maschine installiert sein
].

PROGRAMMIERKONZEPTE: Datenbank, Tabelle, Datenbankserver

 

 

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.
Von Zuhause aus kannst du aber dem Firewall die nötigen Berechtigungen
meist selbst erteilen. Dazu ist es nötig, den Port des Datenbankservers,
z.B. 1527, für die IP-Adresse deines PCs zu öffnen
].

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:

1. Lade von hier die Datei tjderby.zip herunter
2. Packe sie aus und kopiere die Dateien in das Unterverzeichnis Lib des Verzeichnisses, in dem sich tigerjython2.jar befindet.
3. Gehe mit einer Command-Shell in das Verzeichnis Lib und starte den Server mit
java -jar derbynet.jar start
Achtung! Du musst Administratorberechtigungen haben [mehr... In einem geschützten Poolraum verwendest du am besten einen speziell dafür vorgesehenen Computer].

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")
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

 

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")
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

 

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])
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

 

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")
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

 

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

 

1.


Du möchtest für den Benutzer 33 den Sitz 6 reservieren. Dies erreichst du mit einem SQL-Update-Befehl.

sql = "UPDATE " + tbl + " SET booked='Y', cust=33 WHERE seat=6"

Reserviere für den gleichen Benutzer noch den Sitz 5  und für den Benutzer 34 die Sitze 10, 11 und 12. Kontrolliere die Richtigkeit der Reservationen durch Anzeigen der Tabelle.

2.

Mit der SQL-Abfrage

sql = "SELECT * FROM " + tbl + " WHERE booked='Y'"         
          
kannst du alle reservierten Plätze anzeigen.
a. Schreibe ein Programm, das nur die leeren Plätze angezeigt.
b. Es sollen nur alle Reservationen des Benutzers 34 angezeigt werden.


3.

Der Benutzer 34 annulliert alle Reservationen. Führe eine entsprechende Mutation aus.

4.

In Folge einer Saal-Renovation stehen die Plätze 24 - 30 nicht mehr zur Verfügung. Lösche diese Datensätze aus der Tabelle.
Dazu kannst du einen SQL-Befehl nach folgendem Muster benutzen:

sql = "DELETE FROM " + tbl + " WHERE ..."