Seiten-Inhalt
Perl und Datenbanken
Datenbanken und Perl
Bei der Programmierung in Zusammenhang mit Datenbanken kommt
man wohl an SQL (eines erstmals 1986 von der ANSI verabschiedeten Standards)
nicht vorbei. Wer mit SQL gearbeitet hat, lernt, es zu lieben und möchte gar
nicht mehr daran vorbei ,-) Mittlerweile gibt es natürlich viele Erweiterungen
und Weiterentwicklungen dieser Definition.
Als Literatur kann ich zur Arbeit mit SQL das Standard-Werk von Date,
C. sehr empfehlen. Es ist auch in deutsch erhältlich (allerdings ist
die Eindeutschung mancher Begriffe ungünstig gewählt, so dass ich die englische
Version vorziehe). Ein weiteres Buch, welches sich auch allgemein mit Datenbanksystemen
beschäftigt ist von Kemper, A. und Eicker,
A.: " Datenbanksysteme - Eine
Einführung". Wer es gerne noch (sprach-)theoretischer mag,
kann sich von Ullman, J. " Principles
of Database and Knowledge-base Systems" zulegen.
Dies ist die Schnittstelle zu Microsoft-Datenbanken (z.B. MS
Access). Es gibt übrigens auch Treiber für das DBI-Modul, die ODBC unterstützen.
Da die Programmierung über die DBI-Schnittstelle einige viele mehr
Möglichkeiten bietet, einfachere Abfragen an die SQL-Maschinerie zu übergeben,
gehe ich auf die Möglichkeit des ODBC-Treibers an dieser Stelle gar nicht
weiter ein.
MySQL
Über die DBI-Schnittstelle kann man auf MySQL-Datenbanken
zugreifen... Einen Link zum Download des DBMS (Datenbankmanagementsystems)
finden Sie hier.
Eine sehr ausführliche Beschreibung der Möglichkeiten, die MySQL bietet kann
in einer mitinstallierten 2,3 MB grossen Datei C:\Programme\mySQL\Docs\Manual.html
gefunden werden. Dort wird u.a. auch die Syntax von SQL beschrieben. MySQL stellt
nun mal einen "echten Datenbankserver" dar.
Installation
der erforderlichen Module
Für die Zusammenarbeit von Perl
und MySQL sind die Module DBI und DBD-mySQL zu installieren.
Eine kurze Einführung, wie man unter Windows Zusatzmodule recht einfach
installieren kann, finden Sie hier.
Programmschnipsel
use DBI;
my $dbh = DBI->connect ('DBI:mysql:Datenbankname', $usr,$pwd);
$dbh->do ('ALTER TABLE Tabelle ADD (Name char(20));');
$dbh->disconnect();
Um die Daten einer MySQL-Datenbank zu sichern (um sie auch
beispielsweise auf einem anderen Rechner wieder zu installieren), gibt es verschiedene
Möglichkeiten. Eine - vielleicht noch nicht absolut optimale - Methode beschreibe
ich hier:
Um eine Datenbank (oder Teile daraus) zu sichern kann
der Befehl .../MySQL/bin/mysqldump.exe benutzt werden. Ein Aufruf ohne
Parameter liefert alle möglichen Optionen des Programmes. Der Aufruf
von...
mysqldump -t Adressen > sicher.sql
... erstellt eine Datei sicher.sql, die INSERT
Anweisungen enthält, um eine leere Datenbank zu füllen - die
Daten werden der Datenbank Adressen entnommen. Die Option '-t'
verhindert, dass in der Datei auch die Erstellung der Tabellen gespeichert
wird. Weitere Optionen ermöglichen die Spezifikation, welche Tabellen gesichert
werden,
Daten "zurückspielen"
Die gesicherte Datei sicher.sql kann nun unter
der Windows-DOS-Umgebung mit...
mysql Adressen < sicher.sql
... den gesicherten Datenbestand wieder
in die Datenbank Adressen einfügen. Durch Import der Daten
mit mysqldump kann noch 'verhindert' werden, dass versucht wird, bereits
bestehende Tabellen mit CREATE-Anweisungen zu erstellen, was zu einer
Fehlermeldung - und damit zu einem Programmabbruch - führen würde.
(Dank an Volker)
Im idealen Fall sollte die Datenbank durch eine Benutzerverwaltung
gegen unberechtigten Zugriff abgesichert sein. Dadruch wird es dann erforderlich
bei Import der Daten weitere Parameter zu spezifizieren. Mit "-h" kann man
den Hst bzw. die IP des Datenbank-Servers angeben; "-u" erlaubt die Spezifikation
eines Benutzernamens und "-p" weist mysql an, eine Passwortabfrage zu initiieren. So kann
eine passende Kommandozeile etwa folgendermaßen ausehen:
mysql -h 127.0.0.1 -p -u mein_name meine_datenbank < d:\Temp\d
Um Daten aus einer Tabelle auszulesen gibt es mehrere
Möglichkeiten. Diese sind, sich ein Array zurückgeben zu lassen,
eine Referenz auf ein ebensolches oder eine Referenz auf eine Hash
Tabelle. Die Lösung mit der Hash-Tabelle hat den Vorteil, dass
man direkt über die Tabellennamen auf die Felder zugreifen kann und
nicht die Spalten auszählen muss, um die gewünschte Information
zu erhalten. Hier ein paar Codezeilen, die die Arbeit mit o.g. Strukturen
verdeutlichen sollen.
$sth = $dbh->prepare ('SELECT * FROM Adressen;');
$sth->execute();
while (my @erg = $sth->fetchrow_array) {
print "$erg[3]\n"; # gibt das 4. Feld der Tabelle aus
}
##== ... oder lieber(?) mit Hash-Tabellen:
$sth = $dbh->prepare ('SELECT * FROM Adressen;');
$sth->execute();
while (my %erg = $sth->fetchrow_hashref) {
print "$erg->{'vorname'}\n"; # gibt das Feld 'vorname' aus
}
(Achtung bei der Verwendung von
fetchrow_hashref: Perl ist 'case
sensitive' (wie man so schön sagt...). D.h., dass man sehr
mit Gross- und Kleinschreibung der Feldnamen aufpassen muss. SQL
ist die Schreibweise egal - in Perl allerdings kann es passieren, dass
ein Feld 'id' (von Perl) nicht gefunden wird, da beim Tabellenentwurf
ein Feld 'ID' angelegt wurde.
Um dieses Problem zu umgehen, habe ich mir vorgenommen, einfach alle Feldnamen
klein zu schreiben.)
Mit dem Platzhalter '?' im SQL-String und Parametern
in der execute-Funktion kann man 'variable Abfragen' stellen:
$sth = $dbh->prepare ("SELECT * FROM Adressen WHERE name='?';"); # ? ist Platzhalter
for my $item in ('Harry', 'Ron', 'Hermine', 'Sirius', 'Dumbledore') {
$sth->execute ($item);
while (my @erg = $sth->fetchrow_array()) {
# ... tue etwas
}
}
Anfragen mit nur einem Ergebnis (z.B. Anzahl Datensätze)
Häufig ist bekannt, dass eine Anfrage nur einen Wert zurückliefert
- wenn man z.B. die Anzahl der Datensätze ermitteln möchte. Übergibt man
das Ergebnis von fetchrow_array an einen skalaren Wert, so steht in diesem
der gewünschte Wert:
$sth = $dbh->prepare ('SELECT anz(name) FROM Adressen WHERE name=\'harry\';');
$sth->execute();
my $anzahl = $sth->fetchrow_array();
Drucken
letzte Änderung:
18.Sep 2005
|