Zum Inhalt springen

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)

Terminal window
composer require satur.io/duckdb-auto

Sie 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 sql und der nicht-statischen Methode query. 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