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

平台

扩展二进制文件必须为每个平台构建。预构建的二进制文件已为多个平台分发(见下文)。 对于某些扩展包不可用的平台,用户可以从源代码构建它们,并手动安装生成的二进制文件

所有官方扩展都适用于以下平台。

平台名称 操作系统 架构 CPU类型 使用者
linux_amd64 Linux x86_64 (AMD64)   Node.js 包等。
linux_amd64_gcc4 Linux x86_64 (AMD64)   Python 包, CLI, 等。
linux_arm64 Linux AArch64 (ARM64) AWS Graviton, Snapdragon, 等 所有包
osx_amd64 macOS x86_64 (AMD64) Intel 所有包
osx_arm64 macOS AArch64 (ARM64) Apple Silicon M1, M2 等 所有包
windows_amd64 Windows x86_64 (AMD64) Intel, AMD 等 所有包

对于一些Linux ARM发行版(例如,Python),会分发两种不同的二进制文件。这些文件针对的是linux_arm64linux_arm64_gcc4平台。请注意,扩展二进制文件是为第一个平台分发的,而不是第二个。实际上,这意味着在这些平台上,您的glibc版本需要是2.28或更高才能使用分发的扩展二进制文件。

一些扩展程序适用于以下平台:

对于上面列出的平台之外的其他平台,我们不正式分发扩展(例如,linux_arm64_android, linux_arm64_gcc4)。

在客户端之间共享扩展

共享的安装位置允许扩展在相同DuckDB版本的客户端API之间共享,只要它们共享相同的platform或ABI。例如,如果在macOS上使用CLI客户端的0.10.0版本安装了扩展,那么只要Python、R等客户端库能够访问用户的主目录并使用DuckDB版本0.10.0,就可以使用该扩展。

扩展仓库

默认情况下,DuckDB扩展是从一个包含由核心DuckDB团队构建和签名的扩展的单一仓库中安装的。这确保了核心扩展集的稳定性和安全性。这些扩展位于默认的core仓库中,该仓库指向http://extensions.duckdb.org

除了核心仓库,DuckDB 还支持从其他仓库安装扩展。例如,core_nightly 仓库包含为核心扩展构建的夜间版本,这些扩展是为 DuckDB 的最新稳定版本构建的。这允许用户在扩展正式发布之前尝试新功能。

从仓库安装扩展

要从默认仓库安装扩展(默认仓库:core):

INSTALL httpfs;

要从核心仓库显式安装扩展,请运行以下任一命令:

INSTALL httpfs FROM core;

或者:

INSTALL httpfs FROM 'http://extensions.duckdb.org';

要从核心夜间仓库安装扩展:

INSTALL spatial FROM core_nightly;

或者:

INSTALL spatial FROM 'http://nightly-extensions.duckdb.org';

要从DuckDB未知的自定义存储库安装扩展:

INSTALL custom_extension FROM 'https://my-custom-extension-repository';

或者,可以使用custom_extension_repository设置来更改DuckDB使用的默认仓库:

SET custom_extension_repository = 'http://nightly-extensions.duckdb.org';

虽然任何URL或本地路径都可以用作存储库,但DuckDB目前包含以下预定义的存储库:

别名 URL 描述
core http://extensions.duckdb.org DuckDB 核心扩展
core_nightly http://nightly-extensions.duckdb.org core 的夜间构建版本
community http://community-extensions.duckdb.org DuckDB 社区扩展
local_build_debug ./build/debug/repository 在调试模式下从源代码构建DuckDB时创建的存储库(用于开发)
local_build_release ./build/release/repository 在发布模式下从源代码构建DuckDB时创建的存储库(用于开发)

使用多个仓库

在使用来自不同仓库的扩展时,特别是混合使用corecore_nightly时,跟踪不同扩展的来源和版本非常重要。因此,DuckDB在扩展安装元数据中跟踪这些信息。例如:

INSTALL httpfs FROM core;
INSTALL aws FROM core_nightly;
SELECT extension_name, extension_version, installed_from, install_mode FROM duckdb_extensions();

这将输出:

扩展名称 扩展版本 安装来源 安装模式
httpfs 62d61a417f 核心 仓库
aws 42c78d3 core_nightly 仓库

创建自定义仓库

DuckDB 仓库是一个基于 HTTP、HTTPS、S3 或本地文件的目录,它以特定的结构提供扩展文件。 此结构在“直接从 S3 下载扩展”部分中描述,并且对于本地路径和远程服务器是相同的,例如:

base_repository_path_or_url
└── v1.0.0
    └── osx_arm64
        ├── autocomplete.duckdb_extension
        ├── httpfs.duckdb_extension
        ├── icu.duckdb_extension
        ├── inet.duckdb_extension
        ├── json.duckdb_extension
        ├── parquet.duckdb_extension
        ├── tpcds.duckdb_extension
        ├── tpcds.duckdb_extension
        └── tpch.duckdb_extension

查看extension-template 仓库以获取所有必要的代码和脚本来设置仓库。

当从自定义仓库安装扩展时,DuckDB 将搜索压缩和非压缩版本。例如:

INSTALL icu FROM '⟨custom repository⟩';

执行此语句时,将首先在存储库的目录结构中查找icu.duckdb_extension.gz,然后查找icu.duckdb_extension

如果自定义仓库是通过HTTPS或S3提供的,则需要httpfs扩展。当尝试通过HTTPS或S3进行安装时,DuckDB将尝试自动加载 httpfs扩展。

强制安装以升级扩展

当DuckDB安装扩展时,它会被复制到本地目录以进行缓存,并避免未来的网络流量。 任何后续对INSTALL ⟨extension_name⟩的调用都将使用本地版本,而不是再次下载扩展。要强制重新下载扩展,请运行:

FORCE INSTALL extension_name;

强制安装也可以用于用来自另一个仓库的同名扩展覆盖一个扩展,

例如,首先,从核心仓库安装 spatial

INSTALL spatial;

然后,用core_nightly仓库中的spatial扩展覆盖此安装:

FORCE INSTALL spatial FROM core_nightly;

加载和安装扩展的替代方法

直接从S3下载扩展

在构建使用DuckDB的Lambda服务或容器时,直接下载扩展程序可能会很有帮助。 DuckDB扩展程序存储在公共的S3存储桶中,但这些存储桶的目录结构不可搜索。 因此,必须使用文件的直接URL。 要直接下载扩展文件,请使用以下格式:

http://extensions.duckdb.org/v⟨duckdb_version⟩/⟨platform_name⟩/⟨extension_name⟩.duckdb_extension.gz

例如:

http://extensions.duckdb.org/v1.1.3/windows_amd64/json.duckdb_extension.gz

从显式路径安装扩展

INSTALL 可以与 .duckdb_extension 文件的路径一起使用:

INSTALL 'path/to/httpfs.duckdb_extension';

请注意,压缩的 .duckdb_extension.gz 文件需要事先解压缩。也可以指定远程路径。

从显式路径加载扩展

LOAD 可以与 .duckdb_extension 的路径一起使用。 例如,如果文件在(相对)路径 path/to/httpfs.duckdb_extension 下可用,您可以按如下方式加载它:

LOAD 'path/to/httpfs.duckdb_extension';

这将跳过任何当前已安装的扩展,并直接加载指定的扩展。

请注意,目前无法为压缩文件使用远程路径。

从源代码构建和安装扩展

有关从源代码构建和安装扩展的信息,请参阅构建指南

静态链接扩展

要静态链接扩展,请遵循开发者文档的“使用扩展配置文件”部分

树内 vs. 树外

最初,DuckDB扩展仅存在于DuckDB主仓库中,github.com/duckdb/duckdb。这些扩展被称为树内扩展。后来,添加了树外扩展的概念,其中扩展被分离到它们自己的仓库中,我们称之为树外扩展。

虽然从用户的角度来看,通常没有明显的差异,但有一些与版本控制相关的细微差异:

  • in-tree 扩展使用 DuckDB 的版本,而不是拥有自己的版本
  • in-tree 扩展没有专门的发布说明,它们的变化反映在常规的 DuckDB 发布说明
  • 核心的外部扩展通常存放在github.com/duckdb/duckdb_⟨ext_name⟩的仓库中,但名称可能有所不同。详情请参阅完整列表的核心扩展。

Limitations

DuckDB的扩展机制有以下限制:

  • 一旦加载,扩展程序无法重新安装。
  • 扩展无法卸载。