PHP-Client
Der DuckDB-PHP-Client ist ein tertiärer Client und wird von einem Drittanbieter gepflegt.
Client-API für PHP, mit Fokus auf Leistung. Der DuckDB-PHP-Client verwendet intern die offizielle C-API über FFI und erzielt gute Benchmark-Ergebnisse. Diese Bibliothek ist mehr als nur ein Wrapper für die C-API; sie führt eigene, PHP-freundliche Methoden ein, um die Arbeit mit DuckDB zu vereinfachen. Sie ist kompatibel mit Linux, Windows und macOS und erfordert PHP-Version 8.3 oder höher.
Die vollständige Dokumentation ist unter https://duckdb-php.readthedocs.io/ verfügbar.
Automatische Installation (empfohlen für Einsteiger)
composer require satur.io/duckdb-autoSie müssen satur.io/duckdb-auto die Ausführung von Code erlauben, um diese Installationsmethode zu nutzen.
Weitere Details finden Sie unter Installation.
Schnellstart
DuckDB::sql("SELECT 'quack' as my_column")->print();-------------------| my_column |-------------------| quack |-------------------Die hier verwendete Funktion DuckDB::sql() führt die Abfrage in einer neuen
In-Memory-Datenbank aus, die nach dem Abrufen des Ergebnisses zerstört wird.
Das ist nicht der häufigste Anwendungsfall. Sehen wir uns an, wie Sie eine persistente Verbindung erhalten.
Verbindung
$duckDB = DuckDB::create('duck.db'); // or DuckDB::create() for in-memory database
$duckDB->query('CREATE TABLE test (i INTEGER, b BOOL, f FLOAT);');$duckDB->query('INSERT INTO test VALUES (3, true, 1.1), (5, true, 1.2), (3, false, 1.1), (3, null, 1.2);');
$duckDB->query('SELECT * FROM test')->print();Wie Sie vermutlich erraten haben, erzeugt DuckDB::create() eine neue Verbindung zur angegebenen Datenbank
oder erstellt eine neue, falls sie noch nicht existiert, und stellt dann die Verbindung her.
Danach können wir die Funktion query verwenden, um die Anfragen auszuführen.
Beachten Sie den Unterschied zwischen der statischen Methode
sqlund der nicht-statischen Methodequery. Während die erste immer eine neue In-Memory-Datenbank erzeugt und zerstört, verwendet die zweite eine zuvor hergestellte Verbindung und sollte in den meisten Fällen die bevorzugte Option sein.
Darüber hinaus stellt die Bibliothek auch Prepared Statements zum Binden von Parametern an unsere Abfrage bereit.
Prepared Statements
$duckDB = DuckDB::create();
$duckDB->query('CREATE TABLE test (i INTEGER, b BOOL, f FLOAT);');$duckDB->query('INSERT INTO test VALUES (3, true, 1.1), (5, true, 1.2), (3, false, 1.1), (3, null, 1.2);');
$boolPreparedStatement = $duckDB->preparedStatement('SELECT * FROM test WHERE b = $1');$boolPreparedStatement->bindParam(1, true);$result = $boolPreparedStatement->execute();$result->print();
$intPreparedStatement = $duckDB->preparedStatement('SELECT * FROM test WHERE i = ?');$intPreparedStatement->bindParam(1, 3);$result = $intPreparedStatement->execute();$result->print();Appender
Appender sind die bevorzugte Methode, um Daten in DuckDB zu laden. Weitere Informationen finden Sie auf der Appender-Seite.
$duckDB = DuckDB::create();$result = $duckDB->query('CREATE TABLE people (id INTEGER, name VARCHAR);');
$appender = $duckDB->appender('people');
for ($i = 0; $i < 100; ++$i) { $appender->append(rand(1, 100000)); $appender->append('string-'.rand(1, 100)); $appender->endRow();}
$appender->flush();Die Stärken von DuckDB
DuckDB bietet einige bemerkenswerte Funktionen. Zum Beispiel können Sie Remote-Dateien direkt abfragen.
Verwenden wir eine Aggregatfunktion, um den Durchschnitt einer Spalte für eine entfernte Parquet-Datei zu berechnen:
DuckDB::sql( 'SELECT "Reporting Year", avg("Gas Produced, MCF") as "AVG Gas Produced" FROM "https://github.com/plotly/datasets/raw/refs/heads/master/oil-and-gas.parquet" WHERE "Reporting Year" BETWEEN 1985 AND 1990 GROUP BY "Reporting Year";')->print();--------------------------------------| Reporting Year | AVG Gas Produce |--------------------------------------| 1985 | 2461.4047344111 || 1986 | 6060.8575605681 || 1987 | 5047.5813074014 || 1988 | 4763.4090541633 || 1989 | 4175.2989758837 || 1990 | 3706.9404742437 |--------------------------------------Oder fassen Sie eine entfernte CSV-Datei zusammen:
DuckDB::sql('SUMMARIZE TABLE "https://blobs.duckdb.org/data/Star_Trek-Season_1.csv";')->print();------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| column_name | column_type | min | max | approx_unique | avg | std | q25 | q50 | q75 | count | null_percentage |------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| season_num | BIGINT | 1 | 1 | 1 | 1.0 | 0.0 | 1 | 1 | 1 | 30 | 0 || episode_num | BIGINT | 0 | 29 | 29 | 14.5 | 8.8034084308295 | 7 | 14 | 22 | 30 | 0 || aired_date | DATE | 1965-02-28 | 1967-04-13 | 35 | | | 1966-10-20 | 1966-12-22 | 1967-02-16 | 30 | 0 || cnt_kirk_hookup | BIGINT | 0 | 2 | 3 | 0.3333333333333 | 0.6064784348631 | 0 | 0 | 1 | 30 | 0 |...Anforderungen
- Linux, macOS oder Windows.
- x64-Plattform.
- PHP >= 8.3.
- ext-ffi.
Empfohlen
- ext-bcmath – Benötigt für große Ganzzahlen (> PHP_INT_MAX).
- ext-zend-opcache – Für bessere Leistung.
Typunterstützung
Ab Version 1.2.0 unterstützt die Bibliothek alle DuckDB-Dateitypen.
| DuckDB-Typ | SQL-Typ | PHP-Typ |
|---|---|---|
| DUCKDB_TYPE_BOOLEAN | BOOLEAN | bool |
| DUCKDB_TYPE_TINYINT | TINYINT | int |
| DUCKDB_TYPE_SMALLINT | SMALLINT | int |
| DUCKDB_TYPE_INTEGER | INTEGER | int |
| DUCKDB_TYPE_BIGINT | BIGINT | int |
| DUCKDB_TYPE_UTINYINT | UTINYINT | int |
| DUCKDB_TYPE_USMALLINT | USMALLINT | int |
| DUCKDB_TYPE_UINTEGER | UINTEGER | int |
| DUCKDB_TYPE_UBIGINT | UBIGINT | Saturio\DuckDB\Type\Math\LongInteger |
| DUCKDB_TYPE_FLOAT | FLOAT | float |
| DUCKDB_TYPE_DOUBLE | DOUBLE | float |
| DUCKDB_TYPE_TIMESTAMP | TIMESTAMP | Saturio\DuckDB\Type\Timestamp |
| DUCKDB_TYPE_DATE | DATE | Saturio\DuckDB\Type\Date |
| DUCKDB_TYPE_TIME | TIME | Saturio\DuckDB\Type\Time |
| DUCKDB_TYPE_INTERVAL | INTERVAL | Saturio\DuckDB\Type\Interval |
| DUCKDB_TYPE_HUGEINT | HUGEINT | Saturio\DuckDB\Type\Math\LongInteger |
| DUCKDB_TYPE_UHUGEINT | UHUGEINT | Saturio\DuckDB\Type\Math\LongInteger |
| DUCKDB_TYPE_VARCHAR | VARCHAR | string |
| DUCKDB_TYPE_BLOB | BLOB | Saturio\DuckDB\Type\Blob |
| DUCKDB_TYPE_TIMESTAMP_S | TIMESTAMP_S | Saturio\DuckDB\Type\Timestamp |
| DUCKDB_TYPE_TIMESTAMP_MS | TIMESTAMP_MS | Saturio\DuckDB\Type\Timestamp |
| DUCKDB_TYPE_TIMESTAMP_NS | TIMESTAMP_NS | Saturio\DuckDB\Type\Timestamp |
| DUCKDB_TYPE_UUID | UUID | Saturio\DuckDB\Type\UUID |
| DUCKDB_TYPE_TIME_TZ | TIMETZ | Saturio\DuckDB\Type\Time |
| DUCKDB_TYPE_TIMESTAMP_TZ | TIMESTAMPTZ | Saturio\DuckDB\Type\Timestamp |
| DUCKDB_TYPE_DECIMAL | DECIMAL | float |
| DUCKDB_TYPE_ENUM | ENUM | string |
| DUCKDB_TYPE_LIST | LIST | array |
| DUCKDB_TYPE_STRUCT | STRUCT | array |
| DUCKDB_TYPE_ARRAY | ARRAY | array |
| DUCKDB_TYPE_MAP | MAP | array |
| DUCKDB_TYPE_UNION | UNION | mixed |
| DUCKDB_TYPE_BIT | BIT | string |
| DUCKDB_TYPE_BIGNUM | BIGNUM | string |
| DUCKDB_TYPE_SQLNULL | NULL | null |