DuckDB 1.5.0 震撼发布!CLI重写、VARIANT类型、空间函数内置,性能狂飙17%!
6500+ commits,近百位贡献者,这次更新堪称“史诗级”!
各位数据领域的小伙伴们,今天我们要宣布一个重磅消息:DuckDB 1.5.0 正式发布!代号“Variegata”,灵感源自新西兰特有的天堂鸭。这次更新不仅带来了全新设计的命令行客户端,还引入了原生 VARIANT 类型、将 GEOMETRY 类型内置,并实现了非阻塞检查点等多项性能优化。话不多说,直接上干货!
如果你喜欢在终端里操作 DuckDB,那这次更新绝对让你眼前一亮!CLI 现在拥有全新的配色方案、动态提示、分页器,以及一系列便捷命令。
暗色/亮色模式统一,文档风格同步。关键字、字符串、错误信息、函数、数字各有专属颜色,且支持自定义:
.highlight_colors column_name darkgreen bold_underline
.highlight_colors numeric_value red bold
.highlight_colors string_value purple2
FROM ducks;
默认显示当前连接的数据库和 schema,让你时刻知道自己身在何处:
memory D ATTACH 'my_database.duckdb';
memory D USE my_database;
my_database D CREATE SCHEMA my_schema;
my_database D USE my_schema;
my_database.my_schema D ...
.tables 和 DESCRIBEDESCRIBE 直接展示表结构:DESCRIBE ducks;
┌──────────────────────┐
│ ducks │
│ id integer │
│ name varchar │
│ extinct_year integer │
└──────────────────────┘
.tables 则一览所有库、模式、表及其列,层次清晰。_ 访问上一次查询结果再也不怕丢失结果或重复执行耗时查询:
FROM ducks WHERE extinct_year IS NOT NULL;
FROM _; -- 再次查询相同结果
memory D .maxrows 100
memory D FROM range(0, 100);
当结果超过50行时自动启用分页,Linux/Windows 用 Page Up/Down 翻页,macOS 用 Fn+↑/↓,按 Q 退出。
灵感来自 Snowflake 的 VARIANT,现已成为 DuckDB 的一等公民!与 JSON 不同,VARIANT 存储的是带类型的二进制数据,压缩率和查询性能更优。
同一列可以存储不同类型的数据:
CREATE TABLE events (id INTEGER, data VARIANT);
INSERT INTO events VALUES
(1, 42::VARIANT),
(2, 'hello world'::VARIANT),
(3, [1, 2, 3]::VARIANT),
(4, {'name': 'Alice', 'age': 30}::VARIANT);
查询类型信息:
SELECT id, data, variant_typeof(data) AS vtype FROM events;
┌───────┬────────────────────────────┬───────────────────┐
│ id │ data │ vtype │
│ int32 │ variant │ varchar │
├───────┼────────────────────────────┼───────────────────┤
│ 1 │ 42 │ INT32 │
│ 2 │ hello world │ VARCHAR │
│ 3 │ [1, 2, 3] │ ARRAY(3) │
│ 4 │ {'name': Alice, 'age': 30} │ OBJECT(name, age) │
└───────┴────────────────────────────┴───────────────────┘
提取嵌套字段:
SELECT data.name FROM events WHERE id = 4; -- 或使用 variant_extract
Parquet 文件中的 VARIANT 类型也能直接读取,支持“切碎”存储(shredding)。
基于解析表达式文法的全新解析器,带来更智能的建议和更清晰的错误信息。默认关闭,可通过 CALL enable_peg_parser(); 开启。目前已在提示功能中使用(按 Tab 循环选项):
FROM ducks WHERE habitat IS
IS ISNULL ILIKE IN INTERSECT LIKE
未来版本将全面切换。
httpfs 扩展的后端从 httplib 换成了大名鼎鼎的 curl,稳定性和安全性再上一个台阶。原有配置选项(如超时、重试)保持不变。
从 v1.5 开始,旧式箭头语法 x -> x + 1 会触发弃用警告,推荐使用 Python 风格的 lambda x: x + 1。可通过 lambda_syntax 配置控制行为,DuckDB 2.0 将默认禁用箭头语法。
划时代变化:GEOMETRY 类型从扩展移入核心,其他扩展(如 Postgres 扫描器、Arrow 转换)现在可以直接原生使用几何数据。
geometry_always_xy 设置。v1.5 中默认为旧行为(纬度/经度),但会发出警告;v2.0 中旧行为将报错;v2.1 起新行为(经度/纬度)成为默认。检查点期间现在可以并发读取、写入、插入(带索引)和删除!TPC-H SF100 吞吐量提升 17%。聚合函数也有优化,如 last 函数提速 40%。
还在为每次查询前都要ATTACH一堆数据库而烦躁?新函数
read_duckdb让你像查表一样潇洒!
DuckDB 1.5.0 带着一大堆黑科技来了,但今天我们要单独拎出一个极其贴心的小功能 —— read_duckdb 表函数。别看它个头小,用起来是真的香!
假设你手头有 numbers1.db、numbers2.db、numbers3.db 三个数据库,每个里面都有一张表,你想跨库分析数据。过去你得:
ATTACH 'numbers1.db' AS db1;
ATTACH 'numbers2.db' AS db2;
ATTACH 'numbers3.db' AS db3;
-- 然后再写UNION ALL ...
麻烦不说,数据库一多还容易乱。
read_duckdb 来救场现在只需一行:
SELECT min(i), max(i)
FROM read_duckdb('numbers*.db');
结果直接出来:
┌────────┬────────┐
│ min(i) │ max(i) │
│ int64 │ int64 │
├────────┼────────┤
│ 1 │ 5 │
└────────┴────────┘
爽不爽? 不用显式 ATTACH,不用关心内部表名,甚至可以用通配符 * 匹配多个文件!它会自动读取所有匹配数据库中的全部表,并把它们当成一个大的数据源来查询。
read_duckdb 是 DuckDB 1.5.0 新增的表函数,它能直接读取 DuckDB 数据库文件(即使文件没有后缀名)。支持:
read_duckdb('my.db')read_duckdb('data/*.db')read_duckdb('logs_2025*.db') 一口气查全年数据。Python pip:pip install duckdb-cli,然后直接运行 duckdb。
Windows 安装脚本(Beta) :
powershell -NoExit iex (iwr "https://install.duckdb.org/install.ps1").Content
Linux musl libc(如 Alpine) :GitHub 提供二进制包,需安装 libstdc++。
扩展瘦身:DuckLake 扩展体积减少 30%,Excel 扩展减少 60%!
自 v1.4 以来,已有近 100 位贡献者提交了超过 6500 个 commit。感谢每一位社区成员的问题反馈和代码贡献!
立即体验 DuckDB 1.5.0 👉 安装指南
P.S. DuckDB刚刚还上线了全新官网首页,欢迎点击围观!