PHP-Client (PDO)
Die PHP-DuckDB-PDO-Erweiterung ist ein tertiärer Client und wird von einem Drittanbieter gepflegt.
Um
pdo_duckdbzu verwenden, folgen Sie den Anweisungen unten.Die neueste Version von
pdo_duckdbunterstützt DuckDB 1.5.5.
pdo_duckdb ist ein nativer DuckDB-Datenbanktreiber für die Schnittstelle PHP Data Objects (PDO).
Jede Anwendung oder jedes Framework, das mit PDO kompatibel ist, kann pdo_duckdb direkt verwenden.
Die Erweiterung ist threadsicher und vollständig mit FrankenPHP (PHP-ZTS) getestet.
Als native PHP-Erweiterung ist sie in C/C++ implementiert und benötigt weder PHP FFI noch Preloading.
Die Release-Pakete enthalten vorkompilierte Binärdateien für alle unterstützten Plattformen, und DuckDB ist direkt enthalten.
DuckDB-Erweiterungen funktionieren genauso wie in der DuckDB-CLI.
Unterstützte PHP-Versionen: 8.2 oder neuer
Betriebssysteme: Ubuntu 24+, Debian 12+, Fedora 42+, openSUSE 16+, AmazonLinux 2023+, Wolfi OS, Windows Server 2022+ (x64), macOS 14+ (arm64)
Alle DuckDB-Typen werden unterstützt:
Text, Numeric, Date, Time, Interval, JSON, Array, Struct, Map, List, Enum, Variant, Geometry, Union, Bitstring, Blob und Boolean
GitHub: pdo-duckdb-php
Packagist: pdo-duckdb-php
Installation
pdo_duckdb ist vollständig kompatibel mit dem PHP Installer for Extensions (PIE) und kann wie folgt installiert werden:
pie install thomas-0816/pdo-duckdb-phpTesten:
php -m | grep duckdbphp -r 'print_r((new PDO("duckdb::memory:"))->query("SELECT 42 as n")->fetch(PDO::FETCH_ASSOC));'
# Array# (# [n] => 42# )Beispiele
Grundlegende Verwendung
<?php
$duckDb = new PDO('duckdb::memory:');$duckDb->exec('CREATE TABLE table1 (id INTEGER, amount DECIMAL(10, 2), description VARCHAR)');
$statement = $duckDb->prepare('INSERT INTO table1 VALUES (?, ?, ?)');$statement->execute([1, 42.21, 'Hello DuckDB! 🐘 💓 🦆']);
$statement = $duckDb->query('SELECT * FROM table1');print_r($statement->fetchAll(PDO::FETCH_ASSOC));
# Array# (# [0] => Array# (# [id] => 1# [amount] => 42.21# [description] => Hello DuckDB! 🐘 💓 🦆# )# )Datenbanken von der Festplatte oder im Speicher öffnen
<?php
$db = new PDO('duckdb::memory:'); // open in-memory database
$db = new PDO('duckdb:/tmp/test.db'); // open database file from disk
// open database file as read-only$db = new PDO('duckdb:/tmp/test.db', null, null, [PDO::DUCKDB_ATTR_CONFIG => ['access_mode' => 'read_only']]);Parquet-Dateien lesen und schreiben
<?php
$db = new PDO('duckdb::memory:');$db->exec('CREATE TABLE table1 (id INTEGER, text VARCHAR USING COMPRESSION zstd, data JSON)');
$statement = $db->prepare('INSERT INTO table1 VALUES (?, ?, ?)');$statement->execute([1, 'Hello DuckDB 🦆', ['foo' => 'bar', 'baz' => 42]]);
$db->exec("COPY (SELECT * FROM table1) TO '/tmp/table1.parquet' (COMPRESSION zstd)");
foreach ($db->query("SELECT * FROM '/tmp/table1.parquet'", PDO::FETCH_ASSOC) as $row) { print_r($row);}
# Array# (# [id] => 1# [text] => Hello DuckDB 🦆# [data] => Array# (# [foo] => bar# [baz] => 42# )# )CSV-Dateien lesen
<?php
$list = [ ['aaa', 'bbb', 'ccc'], ['123', '456', '789'], ['aaa', 'bbb', 'ccc']];$fp = fopen('/tmp/test.csv', 'w');foreach ($list as $fields) { fputcsv($fp, $fields, ',', '"', '');}fclose($fp);
$db = new PDO('duckdb::memory:');$statement = $db->query("SELECT * FROM '/tmp/test.csv'");print_r($statement->fetchAll(PDO::FETCH_ASSOC));
# Array# (# [0] => Array# (# [aaa] => 123# [bbb] => 456# [ccc] => 789# )# [1] => Array# (# [aaa] => aaa# [bbb] => bbb# [ccc] => ccc# )# )JSON-Dateien lesen
<?php
file_put_contents('/tmp/logs.json', json_encode(['log' => 'log text']) . PHP_EOL, FILE_APPEND);file_put_contents('/tmp/logs.json', json_encode(['log' => 'log text 2']) . PHP_EOL, FILE_APPEND);
$db = new PDO('duckdb::memory:');$statement = $db->query("SELECT * FROM '/tmp/logs.json'");print_r($statement->fetchAll(PDO::FETCH_ASSOC));
# Array# (# [0] => Array# (# [log] => log text# )# [1] => Array# (# [log] => log text 2# )# )
$db->exec("COPY (SELECT * FROM '/tmp/logs.json') TO '/tmp/logs_json.parquet' (COMPRESSION zstd)");Strukturierte Spalten mit festem Schema verwenden
<?php
# s is array{v: string, i: int, a: string[], d: float}
$db = new PDO('duckdb::memory:');$db->exec('CREATE TABLE table1 (s STRUCT(v VARCHAR, i INTEGER, a VARCHAR[], d DECIMAL))');
$statement = $db->prepare('INSERT INTO table1 VALUES (?)');$statement->execute([['v' => 'foo', 'i' => 21, 'a' => ['b', 'c'], 'd' => 42.21]]);
$statement = $db->query('SELECT * FROM table1');print_r($statement->fetch(PDO::FETCH_ASSOC));
# Array# (# [s] => Array# (# [v] => foo# [i] => 21# [a] => Array# (# [0] => b# [1] => c# )# [d] => 42.21# )# )Auto-Increment-Spalten
<?php
$db = new PDO('duckdb::memory:');$db->exec('CREATE SEQUENCE table1_id');$db->exec("CREATE TABLE table1 (id INTEGER PRIMARY KEY DEFAULT nextval('table1_id'))");$statement = $db->query('INSERT INTO table1 VALUES (default) RETURNING *');print_r($statement->fetch(PDO::FETCH_ASSOC));
# Array# (# [id] => 1# )