Grundlagen der Datenbankprogrammierung unter Perl

© © Stanislav Komogorov, 123RF

Erschließungsarbeiten

Beim Programmieren bewähren sich oft Arrays oder Hashes als Datensilos, jedenfalls solange ihre Daten das Programm, das sie verwendet, nicht zu überleben brauchen. Wer wahlfreien Zugriff auf persistente Daten braucht, dem bietet sich beispielsweise eine Datenbank an. Doch wie kommt er dann an die dort gespeicherten Informationen?
Security ist ein stets aktuelles Thema in der IT. Deshalb widmet sich das ADMIN-Magazin 04/2012 speziell Sicherheitsaspekten und gibt Antworten auf die Fragen: ... (mehr)

Um eine Datenbank interaktiv zu befragen, benutzt man am besten einen SQL-Client. Solche Applikationen gibt es für jedes Betriebssystem in unterschiedlicher Qualität beinah wie Sand am Meer. Die Kommandozeilentools darunter kann man durchaus auch aus einem Skript heraus beschicken, dennoch bietet sich für den Datenbankzugriff aus einer Applikation eher eine native Datenbankschnittstelle an. Traditionellerweise hatte jede Datenbank ihre eigene API. Natürlich waren damit auch die Probleme programmiert, sollte man die Datenbank einmal wechseln wollen oder nur eine Version nicht mehr vollständig rückwärts kompatibel sein. Deswegen haben sich schon lange Standards herausgebildet, die entweder sowohl sprach- wie datenbankunabhängig sind, etwa Microsofts ODBC (Open Database Connectivity), oder die einer Sprache zuzuschreiben, aber mit vielen Datenbanken kombinierbar sind. Beispiele dafür sind JDBC (Java Database Connectivity), das zu Java gehört, ADO (ActiveX Data Objects), verbandelt mit Visusal Basic, BDE (Borland Database Engine), ein Kind von Object Pascal/Delphi oder eben Perl-DBI (Perl DataBase Independent), das mit Perl verheiratet ist. Dieses DBI-Interface soll hier vorgestellt werden.

Zweiteiler

Das Datenbank-Interface DBI bestand von Anfang an aus zwei Teilen. Die Befehle des Programmierers nimmt dabei immer das eigentliche DBI-Modul entgegen, das mit »use DBI;« in das Programm eingebunden sein muss, das die Datenbank befragen will. Um die konkrete Datenbeschaffung kümmern sich dagegen datenbankspezifische DBD-Module (Database Driver), die es sowohl für die allermeisten Datenbanken als auch für die oben erwähnten Schnittstellenfamilien gibt. Daneben existieren auch Treiber für Datenstrukturen wie XML oder CSV. Diese Architektur macht es leicht, das System für neue Datenbanken oder Versionen anzupassen, indem man lediglich den passenden Treiber ergänzt, während das DBI-Modul und die Software, die es verwendet, so bleiben kann, wie sie ist. Kein Wunder also, dass das CPAN 30 Bildschirmseiten DBD-Module listet.

Welcher Treiber genau gebraucht wird, um eine konkrete Datenbank anzusprechen, erfährt das DBI-Modul aus einer »connect« -Anweisung, die allen Datenbankabfragen vorausgehen muss. Einen passenden DBD-Treiber muss DBI dann im Perl-Modulpfad finden können.

Wer wissen will, ob das klappen wird, muss freilich nicht auf eine eventuelle Fehlermeldung warten, sondern kann vorher ohne Aufwand testen, welche Datenbanken DBI in der jeweiligen Umgebung bereits kennt. DBI enthält dafür und für verschiedene andere Zwecke eine Reihe von Service-Methoden. Da die datenbankbenutzende Anwendung sicher in nicht wenigen Fällen eine Webapplikation sein wird, benutzen wir hier auch eine Mini-Webseite zum Testen (Listing 1). Das Skript muss für den Benutzer, unter dessen Account der Webserver läuft, ausführbar sein und im »cgi-bin« -Verzeichnis liegen.

Listing 1

Treibertest

 

Wenn alles glatt geht, liefert der Test eine Tabelle mit den Treibernamen. Ist die eigene Datenbank hier noch nicht vorhanden, muss man zuerst das DBD-Treibermodul installieren. Manchmal paketieren Linux-Distributionen eine Auswahl solcher Treiber, Ubuntu beispielsweise zumeist unter dem Namen libdbd-Datenbankname für MySQL, PostgreSQL, SQLite, MS SQL und Sybase. Wer keine Binärpakete vorfindet, kann die Treiber aber auch sehr einfach via CPAN-Shell nachladen.

Königsweg

Sind alle Treiber an Bord, ist die Datenbank eingerichtet und funktioniert sie, geht es los. In den allermeisten Fällen kann sich der Anwender bei gewöhnlichen Abfragen an die Schrittfolge aus Listing 2 halten.

Listing 2

Standardschritte

 

Zeile 4 folgt dem Schema

$dbh = DBI->connect( $data_source, $username, $password, \%attr );

Sie stellt in diesem Fall die Verbindung zu einer MySQL-Datenbank »testdb« mit dem Account des Nutzers »root« ohne Passwort her. Zurückgegeben wird ein Datenbank-Handle, das für eine konkrete Datenbankverbindung über einen bestimmten Treiber steht. Man kann aus einer Anwendung sowohl gleichzeitig Verbindungen zu beliebig vielen verschiedenen Datenbanken aufbauen, als auch mehrere Verbindungen zu ein und derselben Datenbank.

Der Parameter »PrintError« hält DBI dazu an, automatisch Perls »warn()« -Funktion zu verwenden, wenn es auf einen Fehler stößt. Setzt man dagegen wie im Beispiel »RaiseError« auf »1« , dann verwendet DBI stattdessen die »die()« -Funktion und beendet sich im Fehlerfall mit einer Meldung.

Zeile 7 definiert das SQL-Statement und legt es in einer Stringvariablen ab. Danach kann Zeile 8 die Ausführung dieses SQL-Befehls vorbereiten und im Ergebnis ein Statement-Handle zurückliefern. Alle diese Handles sind übrigens Perl-Objekte, was man schon an den Methodenaufrufen sieht. Statement-Handle sind dabei Kinder ihrer Datenbank-Handle.

Mit dem Statement-Handle in der Tasche kann Zeile 9 dann das SQL-Kommando ausführen. Zeile 10 zeigt eine von mehreren Methoden, an das Ergebnis der Datenbank-Recherche zu kommen, was weiter unten ausführlich diskutiert wird. Zeile 11 beendet das Statement. DBI weiß dann beispielsweise, dass es noch nicht abgeholte Zeilen der Ergebnismenge vergessen darf. Diese Methode muss man eigentlich nicht explizit aufrufen, denn der Treiber macht das von sich aus, wenn alle Daten abgeholt sind. Zeile 12 beendet die Datenbankverbindung und gibt von ihr mit Beschlag belegte Ressourcen wieder frei.

comments powered by Disqus

Artikel der Woche

Eigene Registry für Docker-Images

Wer selber Docker-Images herstellt, braucht auch eine eigene Registry. Diese gibt es ebenfalls als Docker-Image, aber nur mit eingeschränkter Funktionalität. Mit einem Auth-Server wird daraus ein brauchbares Repository für Images. (mehr)
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Google+

Ausgabe /2019