Datenbank-Zugriff mit Perl

Datenbank-Zugriff für Browser und Systemverwaltung

Perl bietet die Möglichkeit, mit allen gängigen Datenbanken zusammenzuarbeiten. Das wird am Beispiel der populärsten frei erhältlichen Datenbank MySQL demonstriert.
Alle hier beschriebenen Komponenten sind in professioneller Qualität legal und kostenfrei erhältlich.
Perl ermöglicht Datenbank-Zugriff auf Webseiten (das wird meistens mit PHP programmiert) und für die Systemverwaltung (das ist eine besondere Perl-Domäne).
Perl Scripts für CGI und Systemverwaltung
MySQL Einführung, Voraussetzungen
Perl Voraussetzungen
Verbindung mit einer MySQL-Datenbank
Befehlszyklus SQL-Befehl senden, Ergebnis auswerten
Perl Module Zusatz-Module zur Verwendung von Perl mit Datenbanken

MySQL Datenbank Server

Datenbank Server

Ein Server ist ein Programm, das im Hintergrund läuft, von dem man daher kein Fenster sieht, und das man nicht direkt bedienen lann.
Ein Datenbank-(DB)-Server ist auf die Verwaltung von Daten spezialisiert. Er managt Daten fast jeder beliebigen Art und Anzahl, und zwar besonders schnell, effizient und sicher.
Ein DB-Server versorgt mehrere (typisch tausende) AnwenderInnen.

Datenbank Client

Zusätzlich zum Server benötigt man Client-Software, die einen Zugang zum Server herstellt, das 'User Interface': Am Client kann man z.B. Such-Abfragen eingeben und hier erhält man die Ergebnis-Listen.
Als DB-Client Software werden vorzugsweise dynamische Webseiten verwendet: AnwenderInnen brauchen dann keine spezielle Software für den Datenbank-Zugriff - Ein beliebiger Browser genügt, und zwar auf jedem PC, mit jedem Betriebssystem.

Dynamische Webseiten

Heute erfolgt der Zugang zu Datenbank-(DB)-Servern praktisch nur mehr über ebseiten.
Verwenden sie zumindest für neue Projekte keine veraltete Datenbank-Software, selbst wenn sie diese tatsächlich oder illegal kostenlos bekommen. Den MySQL-DB-Server sowie Webseiten erhält man übrigens legal kostenlos.
Webseiten als Datenbank-Interface dürfen nicht - wie einfache 'statische' Webseiten - immer gleich aussehen, sondern sie müssen sich an die wechselnden Wünsche der AnwenderInnen anpassen. Sie werden daher Live durch eigene Programme erstellt.
Als Programmiersprachen für dynamische Webseiten haben sich → PHP und → Perl etabliert. Damit lassen sich rasch und einfach Datenbank-Clients herstellen.

MySQL Voraussetzungen

für den Zugriff auf eine MySQL-Datenbank mit Perl:
MySQL Datenbank Server installiert und getestet.
Datenbank test mit mindestens einer Tabelle (z.B. personen) und ein paar Datensätzen eingerichtet.
Nicht unbedingt erforderlich, aber sehr empfehlenswert:
MySQL-User root ist durch ein Passwort abgesichert.
MySQL-User test ist eingerichtet und hat freien Zugriff (nur) auf Datenbank test
Das Konsolen-(shell)-Programm mysql funktioniert
Das Standard Verwaltungs-Programm → phpMyAdmin ist installiert und konfiguriert.

Linux

→ MySQL (Server + Client) ist in jeder gängigen Linux-Distribution enthalten. In professionellen Versionen ist der MySQL Server bereits installiert und gestartet, in Desktop-Versionen muss der Befehl zur Installation manuell erteilt werden. Konsultieren sie dazu die Doku ihrer Linux-Distribution.
In seltenen Fällen ist es notwendig, MYSQL (kostenfrei) aus dem Internet zu laden. Besuchen sie dazu die Webseite ihres Linux-Distributors: Dort finden sie eine genau an ihre Linux-Version angepasste MySQL-Installation.
Nur erfahrene EntwicklerInnen sollten versuchen, sich eine eigene MySQL-Version aus dem Quelltext herzustellen (zu compilieren).

Windows

MySQL ist als ausführbares Programm (Binary) für Windows kostenfrei erhältlich. Zum Kennenlernen können sie MySQL problermlos am eigenen Win-PC installieren. Für den professionellen Einsatz werden MySQL Server besser auf Linux betrieben.
Details zur Installation von MySQL auf Windows.

ist eine standardisierte 'Sprache' für den Umgang mit Datenbanken. Alle Datenbank-Server 'verstehen' SQL, natürlich auch MySQL.

Perl

Perl Voraussetzungen

für den Zugriff auf eine MySQL-Datenbank mit Perl:
Perl installiert und getestet.
Perl-Module DBI und DBD-mysql installiert
Tipp:
Wenn sie noch keine Erfahrung mit → Perl gesammelt haben, dann sollten sie nicht unbedingt mit diesem Thema beginnen:
Probieren sie zuerst einige einfache Konsolen-Programme oder dynamische Webseiten herzustellen.

Linux

Perl ist in jeder gängigen Linux-Distribution enthalten und installiert. In allen Linux-Server Distributionen sind auch die Perl Datenbank Module gebrauchsfertig installiert.

Windows

Perl ist für Windows kostenfrei erhältlich. Die Grund-Installation ist einfach, eine professionelle Anpassung erfordert allerdings einige Erfahrung.
Details zu Installation und Test von Perl auf Windows.

Perl-Module

Auf Linux werden Perl-Module je nach Version unterschiedlich installiert, am besten mit der jeweiligen Software-Paket-Verwaltung.
Das Modul DBD-mysql gehört zur Standard-Ausrüstung jeder Distribution.
Wenn es fehlen sollte, kann man es vom Linux-Distributor, notfalls auch von CPAN laden und selbst installieren.

Auf SuSE-Linux starten sie YAST | Software | Software installieren, dann Suche nach perl und Klick auf die beiden Module DBI und DBD-mysql
Auf Windows werden die meisten Perl Datenbank-Treiber von ActiveState leider sehr vernachlässigt. Der Grund ist unbekannt.
Die Suche nach dem Modul DBD-mysql kann mühsam werden.
Auf Win32PerlOrg wird eine Liste von Perl Repositories geführt.
Installieren sie im Perl Paket-Manager zusätzliche Pfade alternativer Anbieter von Perl-Modulen, z.B.
C:\> ppm repo add http://theoryx5.uwinnipeg.ca/ppms
C:\> ppm repo add http://www.bribes.org/perl/ppm
Voraussetzung: → Perl ist installiert und der Pfad zum Perl Paket Manager ppm.bat korrekt eingetragen.
Perl Paket Manager:
Verbinden sie ihren PC mit dem Internet.
Wenn sie zur Verbindung einen → Router / Proxy-Server verwenden: Die Umgebungs-Variable HTTP_PROXY muss korrekt eingestellt sein. ( → Perl-Installation)
Starten sie das Programm, z.B. mit
C:\> ppm
Das PPM-Fenster wird geöffnet und beginnt die Suche nach Repositorien. Das kann einige Minuten (!) dauern.
Geben sie mysql in die Such-Zeile ein und klicken sie das Icon View all packages
Alle verfügbaren Treffer werden angezeigt. Wenn sich darunter die Module DBI und DBD-mysql befinden:
Markieren sie die Module (Rechtsklick | Install), führen sie die Installation aus (Icon Run marked actions). Das kann einige Minuten dauern, weil auch die komplette Dokumentation installiert wird.
Wenn die Module nicht verfügbar sind: Suchen sie im Internet nach weiteren Perl Repositorien und tragen sie diese in PPM ein.
PPM an der Konsole
Alternativ (wesentlich rascher, jedoch mit weniger Komfort) kann man die beiden Module mit der Konsolen-Version von ppm installieren. Das funktioniert nur dann, wenn die gesuchten Module in zumindest einem der installierten Repositorien enthalten sind:
C:\> ppm install dbi
C:\> ppm install dbd-mysql

Wenn der Pfad zum ppm in der Umgebungs-Variablen PATH nicht eingetragen ist, dann müssen sie ihn angeben, z.B.:
C:\> c:\programme\perl\bin\ppm install dbi
C:\> c:\programme\perl\bin\ppm install dbd-mysql

Modul-Test:

Wenn dieses Mini-'Programm' fehlerfrei läuft, dann ist das Modul DBI installiert. Es gibt in einer Schleife alle installierten DB-Treiber aus - Das sollte mindestens den Treiber mysql umfassen.
use DBI;
print "Installed DBI-Drivers:\n";
my %idrv = DBI->installed_drivers;
while (($k,$v) = each %idrv) {
print "$k\n";
}
Ältere Versionen kennen noch nicht das mit installed_drivers zurückgegebene → Hash.
Verwenden sie in diesem Fall das mit avaliable_drivers zurückgegebene → Array.
use DBI;
print "Installed DBI-Drivers:\n";
my @drv = DBI->avaliable_drivers;
foreach $v(@drv) {
print "$v\n";
}

Webserver

Perl arbeitet mit dem Standard-Webserver Apache sowohl auf → Linux als auch auf → Windows perfekt zusammen.
Wenn sie dynamische Webseiten als Client-Software zur Bedienung eines Datenbank-Servers herstellen wollen, dann ist ein Webserver unbedingt erforderlich.
Der Server muss für die Arbeit mit Perl eingerichtet und getestet sein.

Wenn sie Perl als Werkzeug für die Systemverwaltung einsetzen wollen, dann ist ein Webserver nicht erforderlich. Es ist eine besondere Stärke von Perl, Datenbanken zur Systemverwaltung zu nutzen.

MySQL-Verbindung

Zuerst wird die Verwendung von Modul DBI deklariert.

Danach folgen die Vorgaben für den Datenbank-Zugang - (Nur) in diesem Beispiel direkt im Quelltext.

Wenn sich der DB-Server nicht am gleichen PC befindet, dann tragen sie in $db_host dessen Name oder IP-Adresse ein.

In der Variablen $dsn (Data Source Name) wird der Pfad zur Datenbank zusammengestellt.

Dann wird mit Methode connect die Verbindung zum DB-Server versucht.
use DBI;

my $db_host='localhost';
# my $db_host='192.168.0.1';
my $db_name='test_datenbank';
my $db_user='my_user_name';
my $db_pswd='geheim';

my $dsn = "DBI:mysql:database=$db_name;host=$db_host";
my $dbh = DBI->connect($dsn, $db_user, $db_pswd);

if(!$dbh) {die "Keine DB-Verbindung"; }
else {print "DB-Verbindung ist ok\n";}

# Arbeit mit der Datenbank

my $r = $dbh->disconnect;

DB-Handle

Variable $dbh dient als Datenbank-Handle, d.h. als 'Handgriff' für alle weiteren Zugriffe auf diese Datenbank.

Es ist möglich, gleichzeitig mehrere DB-Handles zu führen. Das ist jedoch weder empfehlenswert noch notwendig, sondern eher ein Zeichen mangelhafter Datenbank-Organisation.

disconnect

Am Ende jedes Perl-DB-Programms sollte die Verbindung abgebrochen werden.
Wenn sie einen eigenen (Test)-Server betreiben, dann sind Anzahl und Dauer der MySQL-Verbindungen belanglos. Verbindungen zu professionellen DB-Providern können allerdings erhebliche Kosten verursachen - informieren sie sich vor allfälligen Experimenten über die Tarife ihres DB-Providers.

SQL-Befehlszyklus

Bei der Arbeit mit Datenbanken ist es üblich, SQL-Befehle zu senden, danach die Antwort auszuwerten.
Dieser Zyklus wird so oft wiederholt, wie das die/der AnwenderIn wünscht.

Das Beispiel zeigt, wie ein SQL-Befehl als String $sql erstellt wird, und wie der Befehl mit prepare vorbereitet wird. Der vorbereitete Befehl wird an ein 'Statement Handle' $sth übergeben. Zu einem beliebigen späteren Zeitpunkt wird dieser SQL-Befehl mit execute ausgeführt.
Voraussetzung: Erfolgreiche Verbindung (Connect) mit Handle $dbh
Vorbereitung und Absenden eines SQL-Befehls:
my $sql = qq{show tables};
my $sth = $dbh->prepare($sql);
$sth->execute();
Das Ergebnis des SQL-Befehls kann auf viele verschiedene Arten ausgewertet werden. Das Beispiel übergibt die Antwort des Servers mit fetchrow_array an das Array @ergebnis
In diesem speziellen Fall hat die Ergebnis-Liste nur eine Spalte, daher genügt die Ausgabe der ersten Spalte $ergebnis[0] jeder Zeile.
Auswertung des Ergebnisses
my @ergebnis;
while(@ergebnis=$sth->fetchrow_array) {
print $ergebnis[0]." \n";
}
Die Trennung von Vorbereitung und Ausführung der SQL-Befehle ist eine Spezialität von Perl, die im kommerziellen Bereich sehr wertvoll sein kann - Abhängig von der Tarif-Politik des Datenbank-Providers. Auf eigenen und experimentellen DB-Servern können sie prepare und execute bedenkenlos immer paarweise ausführen.
Wenn die Trennung nicht notwenig ist, dann kann man die beiden Methoden mit do zusammenfassen.
(nur neuere Versionen).
Zusammenfassung von prepare und execute
my $rows = $dbh->do($sql);
Die Rückgabe (hier an $rows ) enthält die Anzahl betroffener Datensätze (records, Zeilen).
Fast alle verwendeten Methoden sind formal unabhängig vom verwendeten DB-Treiber. Sie können daher auf jede Standard SQL-Datenbank angewendet werden.
Dadurch ist es möglich, mit Perl wirklich kompatible DB-Client Programme zu erstellen, die mit jeder SQL-Datenbank jedes Herstellers arbeiten.
Das ist ein großer Vorteil von Perl, z.B. gegenüber → PHP.

In der Praxis ergeben sich trotzdem kleine Unterschiede, weil die Treiber etwas unterschiedlich reagieren. Mit etwas mehr Aufwand für Entwicklung und Test kann man diese Effekte jedoch abfangen und mit Perl absolut kompatible DB-Clients herstellen: Diese Programme laufen nicht nur auf jedem Client-PC sondern arbeiten auch mit allen gängigen DB-Server-Datenbanken.

Perl-Module

Perl bietet eine große Anzahl zusätzlicher Module mit spezialisierten Funktionen.
Am Server ihres Web-Providers können sie keine Module installieren, für den eigenen Gebrauch können die Module jedoch praktische Funktionen enthalten, die evtl. viel Arbeit sparen.
Beispiele für Stichworte bei der Suche nach Modulen:
database, dbd, dbi, mysql, query, sql, ...