⌘+k ctrl+k
1.3 (稳定版)
搜索快捷键 cmd + k | ctrl + k
扩展

DuckDB-Wasm 的(动态)扩展加载模型基于常规 DuckDB 的扩展加载,但由于平台差异,存在一些相关区别。

格式

DuckDB 中的扩展是二进制文件,通过 dlopen 动态加载。二进制文件会附加一个加密签名。DuckDB-Wasm 中的扩展是常规 Wasm 文件,通过 Emscripten 的 dlopen 动态加载。Wasm 文件会附加一个名为 duckdb_signature 的 WebAssembly 自定义节,作为加密签名。这确保了文件仍然是有效的 WebAssembly 文件。

目前,我们要求此自定义节必须是最后一个,但未来可能会放宽此要求。

INSTALLLOAD

在 DuckDB 的原生嵌入中,INSTALL 的语义是从 gzip 获取、解压缩并存储数据到本地磁盘。在 DuckDB 的原生嵌入中,LOAD 的语义是(可选地)执行签名检查,将二进制文件与主 DuckDB 二进制文件动态加载。

在 DuckDB-Wasm 中,由于没有持久的跨会话存储,INSTALL 是一个空操作 (no-op)。LOAD 操作将获取(并即时解压缩)、执行签名检查,通过 Emscripten 对 dlopen 的实现进行动态加载。

自动加载

自动加载,即 DuckDB 能够即时添加扩展功能,在 DuckDB-Wasm 中默认启用。

官方可用扩展列表

扩展名称 描述 别名
autocomplete 在 Shell 中添加自动补全支持  
excel 添加对 Excel 风格格式字符串的支持  
fts 添加对全文搜索索引的支持  
icu 使用 ICU 库添加对时区和排序规则的支持  
inet 添加对 IP 相关数据类型和函数的支持  
json 添加对 JSON 操作的支持  
parquet 添加对 Parquet 文件的读写支持  
sqlite 添加对读取 SQLite 数据库文件的支持 sqlite, sqlite3
sqlsmith    
tpcds 添加 TPC-DS 数据生成和查询支持  
tpch 添加 TPC-H 数据生成和查询支持  

WebAssembly 本质上是一个额外的平台,可能存在平台特有的限制,使得某些扩展无法与原生功能匹配或以不同的方式执行。我们将在此处记录 DuckDB 托管扩展的相关差异。

HTTPFS

目前,HTTPFS 扩展在 DuckDB-Wasm 中不可用。Https 协议功能需要通过一个额外的层——浏览器,这使得其与原生环境有所不同,并对原生可实现的功能增加了一些限制。

相反,DuckDB-Wasm 有一个独立的实现,在大多数情况下可互换使用,但并非支持所有用例(因为它必须遵循浏览器施加的安全规则,例如 CORS)。由于此 CORS 限制,任何使用 HTTPFS 扩展发出的数据请求都必须指向允许(使用 CORS 头)承载 DuckDB-Wasm 实例的网站访问该数据的网站。MDN 网站 是获取有关 CORS 更多信息的重要资源。

扩展签名

与常规 DuckDB 扩展一样,DuckDB-Wasm 扩展在 LOAD 时会默认进行检查,以验证签名并确认扩展未被篡改。扩展签名验证可以通过配置选项禁用。签名是二进制文件本身的属性,因此复制 DuckDB 扩展(例如从不同位置提供)仍将保留有效的签名(例如,用于本地开发)。

获取 DuckDB-Wasm 扩展

官方 DuckDB 扩展在 extensions.duckdb.org 提供服务,这也是 default_extension_repository 选项的默认值。安装扩展时,会构建一个相关的 URL,其形式为 extensions.duckdb.org/$duckdb_version_hash/$duckdb_platform/$name.duckdb_extension.gz

DuckDB-Wasm 扩展仅在加载时获取,URL 形式为:extensions.duckdb.org/duckdb-wasm/$duckdb_version_hash/$duckdb_platform/$name.duckdb_extension.wasm

请注意,文件夹结构中会额外添加 duckdb-wasm,文件以 .wasm 文件的形式提供。

DuckDB-Wasm 扩展使用 Brotli 压缩预压缩提供。从浏览器获取时,扩展将透明地解压缩。如果您想手动获取 duckdb-wasm 扩展,可以使用 curl --compress extensions.duckdb.org/<...>/icu.duckdb_extension.wasm

从第三方仓库提供扩展

与常规 DuckDB 一样,如果您使用 SET custom_extension_repository = some.url.com,后续加载将尝试从以下地址进行:some.url.com/duckdb-wasm/$duckdb_version_hash/$duckdb_platform/$name.duckdb_extension.wasm

请注意,对扩展的 GET 请求需要启用 CORS,浏览器才能允许连接。

工具链

DuckDB-Wasm 及其扩展都已使用最新打包的 Emscripten 工具链编译。