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 提供预编译包。各平台最新包与版本选项以安装页为准:

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);内存库则不会在磁盘上留下库文件。

常见坑

  1. 路径与权限:.open 或 duckdb path/to/db 时,进程需要对目录有写权限。只读挂载、沙箱目录或误用系统保护路径会导致创建失败或无法 checkpoint。
  2. 相对路径与工作目录:CLI 的当前工作目录决定相对路径解析位置;脚本中建议用绝对路径或先 cd 到固定目录,避免找不到「以为存在」的库文件。
  3. 版本与扩展兼容:CLI、Python 包、LOAD 的 扩展 (extensions) 应尽量与同一主版本线对齐;混用很旧的 CLI 与很新的扩展(或相反)可能出现格式或符号不兼容。生产环境请在安装页选择 current 或 LTS,并固定版本。
  4. 多进程写同一文件库:DuckDB 对单文件库的并发写有限制;多进程同时写同一 .db 可能报错。只读打开(如 duckdb -readonly my.db)或改用应用内嵌连接,见官方 Concurrency。
  5. 内存库误以为「已保存」:仅 duckdb 不加路径时,关闭进程后数据默认不保留;需要持久化请显式使用文件路径或 .open my.db。

延伸阅读


上一篇:DuckDB 教程(系列索引) · 下一篇:SQL 基础