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.

ODBC

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.


mySQL - Erste Schritte

MySQLInstallation 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();

Datentransfer zwischen zwei Rechnern / Datensicherung

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:

Daten sichern (MySQL Datenbank)

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

(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

DBI-Programmierung

Anfragen an MySQL-Tabellen

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: 14.Feb 2012

rechte Spalte

Felicitas-Fernsehservice

Ein E-Mail-Dienst, der Ihnen täglich eine Auswahl des TV-Programms zusendet, das anhand einer individuellen Suchwortliste erstellt wurde.
Klicken Sie hier.