Code für jede unterstützte Datenbank
Diese Seite richtet sich an PHP-Entwickler, deren Code SQL ausführt. Exponential 6.0.x unterstützt sechs Datenbanken, und eine Erweiterung, die für die Community ausgeliefert wird, kann auf jede von ihnen treffen. Die Aussage zur Unterstützung mit Versionen und Einstellungen finden Sie unter Datenbankunterstützung; diese Seite handelt davon, Code zu schreiben, der auf allen funktioniert.
Inhalt
- Die sechs Datenbanken und ihre Treiber
- Regeln für portables SQL
- Die portablen Hilfsfunktionen
- Schema: .dba-Dateien, nicht DDL
- MongoDB ist anders
- Prüfen, welche Datenbank läuft
- Über Engines hinweg testen
Die sechs Datenbanken und ihre Treiber
In der Reihenfolge der Präferenz des Projekts:
| Datenbank | DatabaseImplementation | Treiberklasse | PHP-Erweiterung |
|---|---|---|---|
| 1. SQLite 3 (der Standard des Installers) | sqlite3 | eZSQLite3DB | sqlite3 |
| 2. PostgreSQL | ezpostgresql | eZPostgreSQLDB | pgsql |
| 3. MongoDB | mongodb | expMongoDB | mongodb und die Bibliothek mongodb/mongodb |
| 4. MariaDB | ezmysqli | eZMySQLiDB | mysqli |
| 5. Oracle | ezoracle | eZOracleDB (Erweiterung ezoracle) | oci8 |
| 6. MySQL | ezmysqli | eZMySQLiDB | mysqli |
Microsoft SQL Server ist mit zusätzlichem Aufwand möglich (Datenbankunterstützung).
Regeln für portables SQL
| Tun Sie | Vermeiden Sie |
|---|---|
Tabellen- und Spaltennamen in Kleinbuchstaben, ohne Anführungszeichen (acme_report_item) | reservierte Wörter, gemischte Schreibung, Anführung mit Backticks |
arrayQuery( $sql, array( 'limit' => 20, 'offset' => 40 ) ) | LIMIT 40, 20 im SQL |
Standard-Joins und WHERE-Klauseln | UPDATE ... JOIN (SQLite braucht 3.33 und eine Umschreibung; der Treiber schreibt die des Kernels selbst um) |
Ganzzahlen für Zeitstempel (time()) | Engine-spezifische Datumstypen und -funktionen |
| die Hilfsfunktionen unten für Strings und Bits | von Hand geschriebenes CONCAT(), SUBSTRING(), & |
| kurze Transaktionen | lang laufende Schreibvorgänge (SQLite erlaubt jeweils nur einen Schreiber) |
utf8mb4 bei MariaDB und MySQL | utf8 (drei Bytes), das Zeichen außerhalb der Basic Multilingual Plane verliert |
Die portablen Hilfsfunktionen
eZDBInterface bietet Funktionen, die jeder Treiber in seinem eigenen Dialekt schreibt:
| Hilfsfunktion | Liefert |
|---|---|
$db->concatString( array( 'a', "'-'", 'b' ) ) | String-Verkettung |
$db->subString( 'title', 1, 10 ) | einen Teilstring-Ausdruck |
$db->md5( 'title' ) | einen MD5-Ausdruck |
$db->bitAnd( 'flags', 4 ) | einen Ausdruck für bitweises UND |
$db->generateSQLINStatement( $ids, 'id', false, true, 'int' ) | eine IN-Liste mit gecasteten Werten |
$db->escapeString( $value ) | die String-Maskierung des Treibers |
$db->databaseServerVersion() | die Serverversion, wenn Sie verzweigen müssen |
Nach der Klasse des Treibers zu verzweigen ist das letzte Mittel; bevorzugen Sie eine Hilfsfunktion, oder verlagern Sie
die Abfrage in eZPersistentObject.
Schema: .dba-Dateien, nicht DDL
Liefern Sie keine CREATE TABLE-Anweisungen für eine einzelne Engine aus. Beschreiben Sie Ihre Tabellen einmal in einer
.dba-Schemadatei im share/ der Erweiterung und lassen Sie den Schema-Handler (lib/ezdbschema/) die DDL für jede
Engine erzeugen; das Schema des Kernels selbst liegt auf dieselbe Weise vor, mit SQL je Engine in kernel/sql/.
Update-Skripte je Engine liegen in update/database/sqlite/, postgresql/ und mysql/
(Datenbankschema und .dba-Dateien).
MongoDB ist anders
Der MongoDB-Adapter expMongoDB (seit 6.0.14) führt niemals echtes SQL aus. Er übersetzt die SQL-förmigen Aufrufe des
Kernels in Operationen find, aggregate, Insert, Upsert und Delete:
- Handgeschriebenes SQL, das er nicht übersetzen kann, liefert ein leeres Ergebnis und protokolliert eine Warnung;
durchsuchen Sie die Logs nach
MONGO TODO. Erweiterungen mit eigenem SQL brauchen möglicherweise einen MongoDB-Pfad. - Der Adapter braucht PHP 8.2 oder neuer; der Rest des Kernels läuft unter 8.0.
- Der SQL-Abfrage-Cache gilt nicht.
- Es gibt keine SQL-Update-Dateien; die Upgrade-Prüfung vergleicht Collections.
Code, der eZPersistentObject und die Content-API verwendet, funktioniert weit öfter ohne Änderungen als
handgeschriebenes SQL (MongoDB als Datenbank,
Referenz zur MongoDB-Portierung).
Prüfen, welche Datenbank läuft
$db = eZDB::instance();
$name = $db->databaseName(); // 'sqlite', 'postgresql', 'mongo', 'mysql' or 'oracle'MariaDB und MySQL antworten beide mit mysql, weil sie sich den Treiber teilen. Auf der Kommandozeile:
php bin/php/console exp:ini get site.ini/DatabaseSettings/DatabaseImplementationIn der Administration hat Setup > Systeminformationen eine Karte Datenbank (Datenbankunterstützung).
Über Engines hinweg testen
| Engine | Wie Sie Ihren Code testen |
|---|---|
| SQLite | die Standardinstallation; Ihr Entwicklungsrechner |
| PostgreSQL, MySQL | tests/runtests.php --dsn ... --db-per-test, wie die CI (Datenbank- und Live-Tests) |
| MariaDB | durch den MySQL-Treiber abgedeckt; testen Sie auf MariaDB, wenn Ihr SQL ungewöhnlich ist |
| MongoDB | eine Installation mit --db=mongodb; lesen Sie die Logs nach MONGO TODO |
| Oracle | eine Installation mit der Erweiterung ezoracle |
Testen Sie mindestens auf SQLite und auf einer Server-Datenbank, bevor Sie ein Release veröffentlichen.
Verwandte Seiten
- SQL mit eZDB, sicher
- Standard für Datenbanken und SQL
- Kapitel 9: Datenbanken
- Freie Dokumentation: diese Seite darf unter der GNU FDL 1.3 frei kopiert, übersetzt und verbessert werden.
Werden Sie Exponential-Partner
Partner teilen ihre Informationen, stellen Mittel bereit, geben Beiträge zurück und entwickeln die Produkte mit uns, und so wächst Exponential. Eine Partner-Website und ein Dashboard sind für Mitte 2027 geplant: Werden Sie noch heute Partner, damit wir schneller wachsen und neue Funktionen früher liefern.