平台
扩展二进制文件必须为每个平台构建。预构建的二进制文件已为多个平台分发(见下文)。 对于某些扩展包不可用的平台,用户可以从源代码构建它们,并手动安装生成的二进制文件。
所有官方扩展都适用于以下平台。
平台名称 | 操作系统 | 架构 | 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_arm64
或linux_arm64_gcc4
平台。请注意,扩展二进制文件是为第一个平台分发的,而不是第二个。实际上,这意味着在这些平台上,您的glibc版本需要是2.28或更高才能使用分发的扩展二进制文件。
一些扩展程序适用于以下平台:
windows_amd64_mingw
wasm_eh
和wasm_mvp
(参见 DuckDB-Wasm 的扩展)
对于上面列出的平台之外的其他平台,我们不正式分发扩展(例如,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时创建的存储库(用于开发) |
使用多个仓库
在使用来自不同仓库的扩展时,特别是混合使用core
和core_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的扩展机制有以下限制:
- 一旦加载,扩展程序无法重新安装。
- 扩展无法卸载。