iliaal/pdo_duckdb
Composer 安装命令:
pie install iliaal/pdo_duckdb
包简介
PDO driver for DuckDB, the in-process analytical database.
README 文档
README
A PDO driver for DuckDB, the in-process analytical (OLAP) database. Connect to DuckDB through the standard PDO API you already use for SQLite, MySQL and PostgreSQL.
$db = new PDO('duckdb:/path/to/analytics.duckdb'); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $db->prepare('SELECT region, SUM(amount) AS total FROM sales WHERE year = ? GROUP BY region'); $stmt->execute([2026]); foreach ($stmt as $row) { printf("%s: %s\n", $row['region'], $row['total']); }
Requirements
- PHP 8.1 or newer with the
pdoextension - The DuckDB C library (
libduckdb+duckdb.h). Download a prebuiltlibduckdbbundle from the DuckDB installation page or install it via your package manager.
Installation
PIE
pie install iliaal/pdo_duckdb
If duckdb.h and libduckdb are not in a standard location, point the build at
the DuckDB install prefix:
pie install iliaal/pdo_duckdb --with-pdo-duckdb=/opt/duckdb
From source
phpize ./configure --with-pdo-duckdb=/opt/duckdb make make install
Then enable it in php.ini (after pdo):
extension=pdo_duckdb
DSN
duckdb:/path/to/database.duckdb # file-backed database
duckdb::memory: # in-memory database
duckdb: # in-memory database (empty path)
Bulk insert (Appender)
For fast bulk loads, PDO::duckdbAppender() returns a Pdo\Duckdb\Appender
wrapping DuckDB's native appender — far faster than row-by-row INSERT:
$db->exec('CREATE TABLE events (id INTEGER, name VARCHAR, ts TIMESTAMP)'); $app = $db->duckdbAppender('events'); // optional 2nd arg: schema name foreach ($rows as $r) { $app->appendRow($r['id'], $r['name'], $r['ts']); } $app->flush(); // or $app->close() to finalize
appendRow(...$values) takes one argument per column (left to right) and
returns the appender for chaining. PHP null/bool/int/float/string map
to DuckDB values; DuckDB casts them to the target column types.
On PHP 8.4+, PDO::connect('duckdb:…') returns a Pdo\Duckdb instance and
duckdbAppender() lives on that subclass. On new PDO('duckdb:…') (and on PHP
8.1–8.3) the method is available on the PDO object directly; note PHP 8.5 emits a
deprecation for driver methods called on the base PDO class, so prefer
PDO::connect() on 8.4+.
DuckDB extensions
DuckDB extensions load through ordinary SQL — no special API:
$db->exec('LOAD json'); // bundled extensions load offline $db->exec('INSTALL httpfs; LOAD httpfs;'); // downloadable extensions
Usage notes
- Placeholders. Positional
?and named:nameplaceholders are supported; PDO rewrites them to DuckDB$Nparameters. A repeated:nameis bound once. Because:is reserved for placeholders, inlineSTRUCT/MAPliterals must keep a space after the colon ({'k': 1}, not{'k':1}) in prepared queries. - Transactions.
beginTransaction()/commit()/rollBack()map to DuckDBBEGIN TRANSACTION/COMMIT/ROLLBACK. DuckDB is autocommit-by-default with no session toggle, sosetAttribute(PDO::ATTR_AUTOCOMMIT, false)is rejected — usebeginTransaction()for explicit transactions. open_basedir. Whenopen_basediris set, DuckDB's SQL-level external file access (read_csv,COPY,ATTACH,httpfs, …) is disabled so the sandbox holds at the SQL layer, not just for the database file path.lastInsertId()is not supported — DuckDB has no implicit rowid. Use a sequence andcurrval()if you need generated keys.- Type mapping. Integers up to 64-bit signed return as
int,FLOAT/DOUBLEasfloat,BLOBas a binary string, and everything else (VARCHAR,DATE/TIME/TIMESTAMP,DECIMAL,HUGEINT/UBIGINT, nested types) as its canonical string form.
Status
Early release. Result columns are decoded with DuckDB's data-chunk/vector API
(native scalars straight to PHP values; nested/extended types via their
canonical string form). Note that execute() returns a materialized result:
DuckDB buffers the full result set in memory before PDO begins fetching, so a
large SELECT is bounded by available memory rather than streamed row-by-row.
True streaming (the pending-result API) is a planned follow-up.
License
BSD 3-Clause. See LICENSE.
统计信息
- 总下载量: 0
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 3
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: BSD-3-Clause
- 更新时间: 2026-06-18