DuckDB 简介与安装
本节目标
读完本篇,你应能:
- 安装 DuckDB CLI(Command Line Interface,命令行客户端),并确认版本
- 用
duckdb打开内存库 (in-memory database),用duckdb my.db创建或打开持久化库 (persistent database) - 在 CLI 中使用
.help、.open等 dot 命令,并正常退出 - 跑通一条
SELECT,理解结果在终端中的展示方式
DuckDB 是什么
DuckDB 是一款嵌入式分析型数据库 (embedded analytical database):引擎以库的形式跑在你的进程内 (in-process),而不是独立的服务端进程。它面向 OLAP (Online Analytical Processing,联机分析处理) 场景——聚合、扫描、列式分析——而不是高并发小事务的 OLTP。
常见用法包括:本地/笔记本上的数据分析、ETL 管道中的轻量 SQL 引擎、在 Python/R/Go 等语言里直接 import 后执行 SQL。单文件持久化库(如 my.db、*.duckdb)便于拷贝与版本管理;不写路径时则使用临时内存库,进程结束即丢失(除非你先 .open 或导出)。
自 v0.10 起,存储格式在版本间向后兼容;内存与持久化模式在数据大于内存时都可以溢出到磁盘 (spill to disk)。更多连接语义见官方 Connect Overview。
安装 CLI
DuckDB CLI 是单个、无额外依赖的可执行文件,官方为 Windows、macOS、Linux 提供预编译包。各平台最新包与版本选项以安装页为准:
- DuckDB Installation(选择 Command line 与对应 Platform)
macOS(Homebrew)
在 macOS 上,Homebrew 提供稳定包(安装页当前列出的方式之一):
brew install duckdb
duckdb --version
Linux / Windows 与其他方式
- Linux:可从安装页下载对应架构的 CLI 压缩包,或使用官方文档中的
curl https://install.duckdb.org | bash安装脚本(脚本行为与版本以安装页说明为准)。 - Windows:安装页提供
winget install DuckDB.cli等选项;部分构建需要 Microsoft Visual C++ Redistributable。 - Docker:例如
docker run --rm -it -v "$(pwd):/workspace" -w /workspace duckdb/duckdb(详见安装页 Docker Image)。
解压或安装后,在终端进入可执行文件所在目录;POSIX shell 中通常执行 ./duckdb 或确保 duckdb 在 PATH 中。
Python 客户端(预告)
若主要用 Python 而非 CLI,可安装官方 Python 包:
pip install duckdb
语言绑定、连接 API 与最佳实践将在系列第 6 篇 Python 客户端 展开;CLI 与 Python 可共用同一 .duckdb / .db 文件(注意并发与文件锁,见后文「常见坑」)。
启动:内存库与文件库
内存库
不传数据库路径时,CLI 会连接临时内存库(等价于连接字符串 :memory:)。适合试 SQL、跑一次性分析:
duckdb
典型提示类似:Connected to a transient in-memory database.,并建议 Enter ".help" for usage hints.,提示符以 D 开头。
持久化文件库
传入路径会创建或打开单文件数据库(扩展名常用 .duckdb、.db、.ddb):
duckdb my.db
# 或
duckdb ./data/analytics.duckdb
已在 CLI 内时,可用 dot 命令切换连接:
.open my.db
.open :memory:
.open 不带参数时会新建一个内存连接;关闭 CLI 后该内存库不会保留。
CLI 基础:SQL、dot 命令与退出
DuckDB CLI 借鉴了 SQLite 命令行 shell 的交互方式,但 SQL 方言更接近 PostgreSQL。除 SQL 外,以 . 开头的是 dot 命令 (dot commands),行首不能有空格,一般不需要分号。
常用命令:
| 命令 | 作用 |
|---|---|
.help | 列出 dot 命令与简要说明 |
.open FILENAME | 打开或创建持久化库;:memory: 为内存库 |
.tables | 列出当前库的表(有对象时) |
.exit | 退出 CLI |
输入 SQL 时,语句以 ; 结尾再回车才会执行;省略分号可继续换行编写多行 SQL。启动时可加载 ~/.duckdbrc 中的默认配置;若需跳过,可使用 duckdb -init /dev/null(见 CLI 文档)。
退出:支持 Ctrl+D 的平台优先用 Ctrl+D;否则 Ctrl+C 或 .exit。持久化库退出时会 checkpoint 到单文件,并清理 .wal(Write-Ahead Log,预写日志)相关状态。
跑通第一条 SELECT
在 duckdb 或 duckdb my.db 启动后的 D 提示符下执行:
SELECT 'quack' AS greeting, version() AS duckdb_version;
应看到表格形式的结果:greeting 为 quack,duckdb_version 为当前引擎版本字符串。这验证了 CLI、解析器与执行路径均正常。
若已用 duckdb my.db 创建持久化库,可在宿主机文件系统中看到 my.db(以及运行中可能存在的 .wal);内存库则不会在磁盘上留下库文件。
常见坑
- 路径与权限:
.open或duckdb path/to/db时,进程需要对目录有写权限。只读挂载、沙箱目录或误用系统保护路径会导致创建失败或无法 checkpoint。 - 相对路径与工作目录:CLI 的当前工作目录决定相对路径解析位置;脚本中建议用绝对路径或先
cd到固定目录,避免找不到「以为存在」的库文件。 - 版本与扩展兼容:CLI、Python 包、
LOAD的 扩展 (extensions) 应尽量与同一主版本线对齐;混用很旧的 CLI 与很新的扩展(或相反)可能出现格式或符号不兼容。生产环境请在安装页选择 current 或 LTS,并固定版本。 - 多进程写同一文件库:DuckDB 对单文件库的并发写有限制;多进程同时写同一
.db可能报错。只读打开(如duckdb -readonly my.db)或改用应用内嵌连接,见官方 Concurrency。 - 内存库误以为「已保存」:仅
duckdb不加路径时,关闭进程后数据默认不保留;需要持久化请显式使用文件路径或.open my.db。
延伸阅读
- Connect Overview — 内存库、持久化库、溢出与连接方式
- Command Line Client — 参数、dot 命令、编辑与自动补全
- DuckDB Installation — 各平台 CLI 与客户端安装
- 系列索引:DuckDB 教程
- 下一篇:SQL 基础 — 从
SELECT/WHERE/GROUP BY与 Friendly SQL 系统入门 DuckDB SQL
上一篇:DuckDB 教程(系列索引) · 下一篇:SQL 基础