搜索快捷键 cmd + k | ctrl + k
常见问题

社区扩展安装安全吗?

与其他包管理系统类似,DuckDB 的社区扩展仓库包含社区贡献的代码,因此,无法保证扩展内容的安全性。DuckDB 基金会和 DuckDB 实验室不审查社区扩展中的代码,因此无法保证 DuckDB 社区扩展是安全的。

有关保护您的 DuckDB 设置的详细信息,请参阅保护扩展页面

安装扩展时如何保护我的 DuckDB 设置?

社区扩展的加载可以通过以下单向配置选项明确禁用

SET allow_community_extensions = false;

有关保护您的 DuckDB 设置的详细信息,请参阅保护扩展页面

我可以将 SQL 宏作为扩展公开吗?

将 DuckDB 扩展编写为 SQL 宏的集合已经有一些扩展做到了。例如,pivot_tablechsql 扩展遵循这种模式。

目前需要一些 C++ 包装器代码,但这可能是构建社区扩展最简单的方法,并且也是安全分发一组实用宏的最佳方式。

我可以用 Rust 编写扩展吗?

用 Rust 编写 DuckDB 扩展是可行的,并且一些扩展已经存在,提供了各种可供借鉴的示例。

目前,编写基于 Rust 的 DuckDB 扩展需要用 C++ 编写胶水代码,并且会强制您通过 DuckDB 的基于 CMake 和 C++ 的扩展模板进行构建。我们理解这并不理想,并承认 Rust 开发者更喜欢在纯 Rust 代码库上工作。基于此(以及许多其他)原因,一个C 扩展 API 正在开发中,它将允许编写纯 Rust 的 DuckDB 扩展。随着 C 扩展 API 的成熟,将提供一个纯 Rust 扩展模板。

我可以用 Go 编写扩展吗?

我们正在努力为扩展添加 Go 支持。

如何用语言 X 编写我的扩展?

DuckDB 的扩展模板基于 DuckDB C++ API,并使用 DuckDB 基于 CMake 的构建系统。DuckDB 团队目前仅支持使用此框架编写的扩展。但是请注意,CMake 非常灵活:例如,已经存在一些基于 Rust 的示例。

此外,自 DuckDB v1.1 起,一个新的C 扩展 API 可用。

扩展之间的命名冲突如何处理?

目前,DuckDB 扩展必须具有唯一的名称。因此,引入命名冲突的 PR 将不被接受,需要重命名。为了解决这个问题,手动命名空间化将是一种解决方案,例如将您的供应商名称作为前缀添加到扩展名称中:⟨vendor_name⟩_⟨extension_name⟩

请注意,通常情况下,DuckDB 团队保留拒绝扩展名称或强制扩展重命名的权利。例如,当某个扩展不再积极维护时,DuckDB 团队可能会决定重命名甚至删除该扩展,以便将名称提供给其他扩展使用。不过请放心,在采取此类严厉行动之前,我们都会联系扩展维护者。

CI 工具链缺少依赖项 X,该怎么办?

用于编译 DuckDB 扩展的工具链可能不包含构建您的扩展所需的所有构建时依赖项。如果是这种情况,请直接提交 PR,将工具链组件添加为可选附加项

另外,您可以尝试通过扩展仓库中的Makefile 添加所需依赖项的安装。但是,需要提醒您的是,随着 DuckDB 及其工具链的更新,这可能会导致构建系统更加脆弱,并相应增加维护工作量。