Arbeiten mit der Datenbank in Drupal 7 - Lektion 1 - Drupal DB API
Wenn Sie Module für die 6. Version von Drupal geschrieben haben, wird es Ihnen nicht schwerfallen, auf die neue Database API von Drupal 7 umzusteigen. Die neue DB API basiert auf der PHP PDO-Erweiterung, was ihr die Fähigkeit gibt, mit verschiedenen Datenbanken wie MySQL, PostgreSQL, MSSQL und möglicherweise Oracle zu arbeiten. Was die Einfachheit betrifft, ist es schwierig zu sagen, da man sich an die neue Syntax gewöhnen muss; das Schreiben von SQL-Anfragen ist wesentlich vertrauter.
Hier ist ein kleiner Auszug aus der offiziellen Dokumentation:
Drupal 7 Database API bietet eine standardisierte, intuitive Abstraktionsebene für den Zugriff auf Datenbankserver. Diese API wurde so entworfen, dass sie die Syntax und die Ausdrucksstärke von SQL so weit wie möglich bewahrt, jedoch auch:
- Unterstützt mehrere Datenbankserver einfach;
- Ermöglicht Entwicklern die Erstellung komplexerer Datenbankfunktionen, wie z.B. Transaktionen;
- Bietet eine strukturierte Schnittstelle zum dynamischen Aufbau von Abfragen;
- Gewährleistet Sicherheit und andere bewährte Vorgehensweisen;
- Stellt Modulen eine saubere Schnittstelle zum Abfangen und Modifizieren von Seitenanfragen bereit;
Die Hauptdokumentation zur Database API ist direkt im Code in Kommentaren eingebettet. Das Handbook ist um API-Dokumentation erweitert und dient als Einführung für Modulautoren, die gut mit Datenbankservern arbeiten möchten, insbesondere aus Sicht eines Administrators. Das Handbook deckt möglicherweise nicht alle API-Funktionen ab.
- Die Database API ist mit dem Konzept der objektorientierten Programmierung entwickelt und dieses Dokument setzt zumindest eine teilweise Vertrautheit damit voraus. Allerdings sind die meisten allgemeinen Operationen funktional gestaltet, so dass Entwickler auch die funktionale Herangehensweise beim Schreiben von Code wählen können.
Hauptkonzept der Drupal Database API
Die Datenbankabstraktionsebene (im Folgenden db layer) in Drupal basiert auf der PHP PDO-Bibliothek. PDO stellt eine einheitliche, objektorientierte API für den Zugriff auf verschiedene Datenbanken bereit, bietet jedoch keine Abstraktion für die unterschiedlichen SQL-Dialekte der jeweiligen Datenbankserver.
Treiber
Da verschiedene Datenbanken unterschiedliche Interaktionen benötigen, erfordert der Drupal db layer für jeden Datenbanktyp einen eigenen Treiber. Der Treiber besteht aus einer Reihe von Dateien, die im Verzeichnis includes/database/driver abgelegt sind, wobei driver ein String ist, der den eindeutigen Schlüssel für diesen Treiber repräsentiert. In vielen Fällen entspricht der Treiberschlüssel dem Namen der Datenbank in Kleinbuchstaben, wie z.B. "mysql", "pgsql" oder "mycustomdriver".
Jeder Treiber besteht aus mehreren Klassen, die von Elternklassen im Kernsystem erben. Diese Treiberklassen können beliebiges Verhalten überschreiben, das für die korrekte Unterstützung der jeweiligen Datenbank erforderlich ist. Die Treiberklassen sind immer so benannt, dass nach dem Unterstrich der Treibername in Kleinbuchstaben folgt. Zum Beispiel heißt die spezifische MySQL-Version der InsertQuery-Klasse InsertQuery_mysql.
Datenbankverbindung
Eine Verbindung ist ein Objekt der Klasse DatabaseConnection, die von der PDO-Klasse erbt. Jede Datenbank, zu der Drupal eine Verbindung herstellt, hat eine einzelne Verbindung und das zugehörige Objekt. Das Verbindungsklassenobjekt kann eine Unterklasse für jeden individuellen Treiber sein.
Um auf das Verbindungsobjekt zuzugreifen, kann man folgendes verwenden:
<?php $conn = Database::getConnection($target, $key); ?>
Um auf die aktuell aktive Verbindung zuzugreifen:
<?php $conn = Database::getConnection(); ?>
So erhalten wir Zugriff auf die aktive Verbindung.
In den allermeisten Fällen benötigen Sie keinen direkten Zugriff auf das Verbindungsobjekt. Die umschließende Prozedur übernimmt dies für Sie. Der einzige Grund ist, wenn Sie komplexe Abfragen über mehrere Datenbanken hinweg ausführen möchten und nicht die aktive Datenbankverbindung wechseln wollen.
Um die aktive Verbindung zu setzen, verwenden Sie:
<?php db_set_active($key); ?>
Datenbankabfragen
Eine Abfrage ist ein SQL-Ausdruck, der über die Datenbankverbindung gesendet wird. Die Drupal DB API unterstützt sechs Arten von Datenbankabfragen: statisch (Static), dynamisch (Dynamic), Einfügen (Insert), Aktualisieren (Update), Löschen (Delete) und Zusammenführen (Merge). Einige Abfragen können als SQL-Strings anstelle von objektorientiertem Query Builder verwendet werden. Das Abfrageobjekt verweist auf einen Query Builder für die Auswahl eines Abfragetypen.
Schreiben einer Abfrage
Die Deklaration eines Objekts erfolgt als Ergebnis einer SELECT-Abfrage. Dies ist immer ein Objekt vom Typ DatabaseStatement oder eine Unterklasse davon. DatabaseStatement ist eine Erweiterung der PDOStatement-Klasse.
Drupal verwendet vorbereitete Anweisungen für alle Abfragen. Eine vorbereitete Anweisung ist eine Vorlage für eine Abfrage, in die Werte bei der Ausführung eingesetzt werden. Diese vorbereiteten Anweisungen sind das SQL-Äquivalent, das mit Parametern aufgerufen wird. In PDO entspricht dies einem einzigen explizit vorbereiteten Statement-Objekt, bei dessen Ausführung die aktuellen Werte an den vorgesehenen Stellen eingesetzt werden. Diese Anweisung kann wiederverwendet werden. Tatsächlich sind Anweisung und Ergebnis Synonyme, aber nur nachdem die Anweisung ausgeführt wurde.
Drupal gibt vorbereitete Statements nicht direkt frei. Stattdessen verwendet der Entwickler ein Abfrageobjekt mit einer SQL-Zeichenkette ohne SQL, die dann ausgeführt wird.