⌘+k ctrl+k
1.1.3 (stable)
Search Shortcut cmd + k | ctrl + k
Extensions

概述

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中可用,需要完成两个步骤:

  1. 扩展安装是下载扩展二进制文件并验证其元数据的过程。在安装过程中,DuckDB将下载的扩展和一些元数据存储在本地目录中。DuckDB可以从该目录中随时加载扩展。这意味着安装只需要进行一次。

  2. 扩展加载是将二进制文件动态加载到DuckDB实例中的过程。DuckDB将在本地扩展目录中搜索已安装的扩展,然后加载它以使其功能可用。这意味着每次DuckDB重新启动时,所有使用的扩展都需要(重新)加载。

扩展的安装和加载受到一些限制

有两种主要方法可以让DuckDB执行可安装扩展的安装加载步骤:显式和通过自动加载

显式 INSTALLLOAD

在DuckDB中,扩展也可以显式安装和加载。无论是非自动加载还是自动加载的扩展都可以通过这种方式安装。 要显式安装和加载扩展,DuckDB有专门的SQL语句LOADINSTALL。例如, 要安装并加载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 扩展。不需要显式的 INSTALLLOAD 语句。

并非所有扩展都可以自动加载。这可能有多种原因:一些扩展对正在运行的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文档中的加载和安装扩展部分

使用扩展

有关高级安装说明和扩展的更多详细信息,请参阅使用扩展页面

本节中的页面