概述
DuckDB 拥有一个灵活的扩展机制,允许动态加载扩展。 这些扩展可以通过提供对额外文件格式的支持、引入新类型以及特定领域的功能来扩展 DuckDB 的功能。
扩展可以在所有客户端(例如,Python 和 R)上加载。 通过核心和社区仓库分发的扩展在 macOS、Windows 和 Linux 上进行了构建和测试。所有操作系统都支持 AMD64 和 ARM64 架构。
列出扩展
要获取扩展列表,请使用 duckdb_extensions
:
SELECT extension_name, installed, description
FROM duckdb_extensions();
扩展名称 | 已安装 | 描述 |
---|---|---|
arrow | false | Apache Arrow 和 DuckDB 之间的零拷贝数据集成 |
autocomplete | false | 在shell中添加自动完成支持 |
… | … | … |
此列表将显示哪些扩展可用,哪些扩展已安装,安装的版本,安装位置等信息。 该列表包括大多数(但不是全部)可用的核心扩展。有关完整列表,我们维护了一个核心扩展列表。
内置扩展
DuckDB的二进制发行版标准配备了一些内置扩展。它们静态链接到二进制文件中,可以直接使用。
例如,使用内置的json
扩展来读取JSON文件:
SELECT *
FROM 'test.json';
为了使DuckDB发行版轻量化,仅内置了一些必要的扩展,每个发行版略有不同。哪个扩展在哪个平台上内置的详细信息记录在核心扩展列表中。
安装更多扩展
要使一个非内置的扩展在DuckDB中可用,需要完成两个步骤:
-
扩展安装是下载扩展二进制文件并验证其元数据的过程。在安装过程中,DuckDB将下载的扩展和一些元数据存储在本地目录中。DuckDB可以从该目录中随时加载扩展。这意味着安装只需要进行一次。
-
扩展加载是将二进制文件动态加载到DuckDB实例中的过程。DuckDB将在本地扩展目录中搜索已安装的扩展,然后加载它以使其功能可用。这意味着每次DuckDB重新启动时,所有使用的扩展都需要(重新)加载。
扩展的安装和加载受到一些限制。
有两种主要方法可以让DuckDB执行可安装扩展的安装和加载步骤:显式和通过自动加载。
显式 INSTALL
和 LOAD
在DuckDB中,扩展也可以显式安装和加载。无论是非自动加载还是自动加载的扩展都可以通过这种方式安装。
要显式安装和加载扩展,DuckDB有专门的SQL语句LOAD
和INSTALL
。例如,
要安装并加载spatial
扩展,请运行:
INSTALL spatial;
LOAD spatial;
通过这些语句,DuckDB 将确保空间扩展已安装(如果已经安装,则忽略 INSTALL
语句),然后继续 LOAD
空间扩展(如果已经加载,则再次忽略该语句)。
扩展仓库
可选地,可以提供一个存储库,指定扩展应从何处安装,方法是将FROM
附加到INSTALL
/FORCE INSTALL
命令。
这个存储库可以是一个别名,例如community
,也可以是一个直接URL,以单引号字符串形式提供。
安装/加载扩展后,可以使用duckdb_extensions
函数来获取更多信息。
自动加载扩展
对于DuckDB的许多核心扩展,显式加载和安装扩展是不必要的。DuckDB包含一个自动加载机制,可以在查询中使用核心扩展时自动安装和加载它们。例如,当运行以下代码时:
SELECT *
FROM 'https://raw.githubusercontent.com/duckdb/duckdb-web/main/data/weather.csv';
DuckDB 会自动安装并加载 httpfs
扩展。不需要显式的 INSTALL
或 LOAD
语句。
并非所有扩展都可以自动加载。这可能有多种原因:一些扩展对正在运行的DuckDB实例进行了多次更改,使得自动加载在技术上(尚)不可行。对于其他扩展,由于它们修改DuckDB行为的方式,更倾向于让用户在使用前明确选择加入该扩展。
要查看哪些扩展可以自动加载,请查看核心扩展列表。
Community Extensions
DuckDB 支持安装第三方 社区扩展。这些扩展由社区成员贡献,但它们在一个集中的存储库中构建、签名和分发。
通过客户端API安装扩展
对于许多客户端来说,使用SQL来加载和安装扩展是首选方法。然而,一些客户端有专门的API来安装和加载扩展。例如Python API客户端,它有专门的install_extension(name: str)
和load_extension(name: str)
方法。有关特定客户端API的更多详细信息,请参阅客户端API文档
更新扩展
虽然内置扩展由于其内置在DuckDB二进制文件中的性质而与DuckDB版本绑定,但可安装的扩展可以并且确实会收到更新。为了确保所有当前安装的扩展都是最新版本,请调用:
UPDATE EXTENSIONS;
有关扩展版本的更多详细信息,请参阅扩展版本控制。
安装位置
默认情况下,扩展安装在用户的主目录下:
~/.duckdb/extensions/⟨duckdb_version⟩/⟨platform_name⟩/
对于稳定的DuckDB版本,⟨duckdb_version⟩
将等于该版本的版本标签。对于DuckDB的夜间构建版本,它将等于构建的短git哈希值。例如,macOS ARM64(Apple Silicon)上的DuckDB版本v0.10.3的扩展安装在~/.duckdb/extensions/v0.10.3/osx_arm64/
。一个DuckDB夜间构建版本的示例安装路径可能是~/.duckdb/extensions/fc2e4b26a6/linux_amd64_gcc4
。
要更改DuckDB存储其扩展的默认位置,请使用extension_directory
配置选项:
SET extension_directory = '/path/to/your/extension/directory';
请注意,设置home_directory
配置选项的值对扩展的位置没有影响。
二进制兼容性
为了避免二进制兼容性问题,DuckDB分发的二进制扩展与特定的DuckDB版本和平台绑定。这意味着DuckDB可以自动检测其与可加载扩展之间的二进制兼容性。当尝试加载为不同版本或平台编译的扩展时,DuckDB将抛出错误并拒绝加载该扩展。
有关可用平台的详细信息,请参阅使用扩展页面。
开发扩展
核心扩展使用的相同API可用于开发扩展。这允许用户扩展DuckDB的功能,使其最适合他们的领域。
创建扩展的模板可在extension-template
仓库中找到。此模板还包含一些关于如何开始构建自己的扩展的文档。
扩展签名
扩展使用加密密钥进行签名,这也简化了分发(这就是为什么它们通过HTTP而不是HTTPS提供服务)。 默认情况下,DuckDB使用其内置的公钥在加载扩展之前验证其完整性。 DuckDB核心团队提供的所有扩展都已签名。
无符号扩展
警告 仅从您信任的来源加载未签名的扩展程序。此外,避免通过HTTP加载它们。
如果您希望加载自己的扩展或来自第三方的扩展,您需要启用allow_unsigned_extensions
标志。
要使用CLI客户端加载未签名的扩展,请在启动时传递-unsigned
标志:
duckdb -unsigned
现在可以加载任何扩展,无论是否签名:
LOAD './some/local/ext.duckdb_extension';
对于客户端API,需要设置allow_unsigned_extensions
数据库配置选项,请参阅相应的客户端API文档。
例如,对于Python客户端,请参阅Python API文档中的加载和安装扩展部分。
使用扩展
有关高级安装说明和扩展的更多详细信息,请参阅使用扩展页面。