Turso:用 Rust 重写 SQLite,为 AI Agent 时代准备的嵌入式数据库

痛点切入

你需要给每个 AI Agent 配一个独立数据库。不是共享一个 Postgres 实例然后靠行级权限隔离——那样每个 Agent 启动时都要等连接池分配、等冷启动、等 schema 迁移。你需要的是:Agent 启动即有数据库,Agent 销毁即释放资源,零开销。

传统数据库做不到这件事。它们是进程模型——每个连接消耗一个进程或线程,多租户隔离靠的是逻辑层而非物理层。当你需要同时运行几万个 Agent 时,光是连接数就把数据库压垮了。

Turso 解决的正是这个问题:文件级数据库,不是进程级数据库。每个 Agent 一个文件,sub-microsecond 延迟,天然多租户。

项目简介

Turso 是用 Rust 从零重写的嵌入式关系型数据库引擎,兼容 SQLite 的 SQL 方言、文件格式和 C API。GitHub 21k+ star,1.1k fork,MIT 协议。

它的前身是 libSQL——一个 SQLite 的 fork。但 fork 的路走不通:SQLite 的代码库太老、太复杂,改动成本极高。于是 Turso 团队做了一个大胆决定:用 Rust 从零重写 SQLite 的核心,保留兼容性的同时加入现代特性。

这不是学术项目。Turso 已经在生产环境跑了——Turso Cloud 本身、Kin AI 助手、Spice.ai、Adaptive.ai 都在用它。

为什么是它

并发写入:SQLite 的历史痛点

SQLite 最被人诟病的限制就是写入串行化。WAL 模式虽然允许读写并发,但写入者永远只有一个。这对单用户应用没问题,对多租户系统是致命的。

Turso 通过 MVCC(多版本并发控制)解决了这个问题。开启 PRAGMA journal_mode = mvcc 后,你可以用 BEGIN CONCURRENT 启动并发事务——多个写入者同时操作数据库,提交时做行级冲突检测,冲突则返回 SQLITE_BUSY 让应用重试。

这是 SQLite 生态里第一次出现真正的并发写入能力。 虽然 MVCC 目前还是实验性的(索引不支持、大数据库启动慢、只支持 TRUNCATE checkpoint),但方向是对的。

向量搜索:AI 应用的刚需

内置向量搜索支持。不需要外挂扩展,不需要额外的 Milvus/Qdrant 实例。

支持四种向量类型:

  • Float32/Float64 密集向量 — 标准神经网络 embedding,每维 4/8 字节
  • Float32 稀疏向量 — 只存非零值和索引,TF-IDF、词袋模型的理想选择
  • 8-bit 量化向量 — 内存省 4 倍(1 字节/维 + 8 字节参数),精度损失极小
  • 1-bit 二值向量 — 极端压缩,32 倍省内存,正→1 非正→0

距离计算函数齐全:余弦距离(文本 embedding 首选)、欧氏距离(图像 embedding 首选)、点积(归一化向量等价于余弦)、Jaccard(稀疏向量首选)。对 AI Agent 的 RAG 场景来说,这意味着你可以在本地完成向量检索,不用把 embedding 发到远程服务。

全文检索:基于 Tantivy 的搜索引擎

实验性功能,但已经可用。底层是 Rust 的 Tantivy 搜索库——性能和功能对标 Lucene。

支持 5 种 tokenizer:default(通用英文)、raw(精确匹配)、simple(空格分词)、whitespace(空格切分)、ngram(2-3 字符子串,适合自动补全)。

字段权重可配——标题匹配权重 2x、正文 1x,BM25 评分排序。查询语法支持布尔操作、短语搜索、前缀搜索、字段过滤和权重提升。

Change Data Capture:实时变更追踪

通过 PRAGMA capture_data_changes_conn('full') 开启 CDC 后,每次 INSERT/UPDATE/DELETE 都会被记录到 turso_cdc 表——包含变更前后的完整行状态。

五种捕获模式:off(关闭)、id(只记 rowid)、before(变更前状态)、after(变更后状态)、full(前后都记,推荐用于审计)。

对需要审计日志、事件驱动架构、或者增量同步的场景非常有用。而且 CDC 记录在事务提交前就可见,不需要等 COMMIT。

多语言绑定 + WASM

Rust、JavaScript、Python、Go、Java、.NET 全有绑定。JavaScript 还支持 WebAssembly 版本,可以直接跑在浏览器里,配合 OPFS 实现持久化。

MCP Server 模式内置在 CLI 里,一条命令就能让 Claude Code、Cursor 等 AI 工具直接操作数据库。

快速上手

安装

# macOS / Linux
curl --proto '=https' --tlsv1.2 -LsSf \
  https://github.com/tursodatabase/turso/releases/latest/download/turso_cli-installer.sh | sh

# Homebrew
brew install turso

Hello World

$ tursodb
Turso
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database
turso> CREATE TABLE users (id INT, username TEXT);
turso> INSERT INTO users VALUES (1, 'alice');
turso> INSERT INTO users VALUES (2, 'bob');
turso> SELECT * FROM users;
1|alice
2|bob

Shell 支持 .schema(查看表结构)和 .dump(导出 SQL)两个命令。常用 CLI 选项包括 -m list(紧凑输出格式)、--readonly(只读模式)、--mcp(启动 MCP Server)。

事务模型详解

Turso 支持三种事务模式,这是理解它行为的关键:

Deferred(默认):事务启动时不获取任何锁。第一条 SELECT 开始读事务,第一条 INSERT/UPDATE/DELETE 升级为写事务。如果事务一直没用,数据库会自动重启它;但如果已经读过数据,就需要应用手动 ROLLBACK 重启。

Immediate:启动即获取写锁,阻止其他写事务。EXCLUSIVEIMMEDIATE 的别名。适用于需要独占写入的场景(如 schema 变更)。

Concurrent(MVCC 模式下):启动时不获取任何锁,多个并发事务同时读写。提交时做行级冲突检测——如果另一事务修改了同一行,返回 SQLITE_BUSY。提供快照隔离级别。

关键约束:每个连接同一时间只能有一个活跃事务。 需要并发就必须用不同连接。

JavaScript 集成

import { connect } from '@tursodatabase/database';

const db = await connect('turso.db');
const row = db.prepare('SELECT 1').get();
console.log(row);

Python 集成

import turso

con = turso.connect("sqlite.db")
cur = con.cursor()
res = cur.execute("SELECT * FROM users")
print(res.fetchone())

Rust 集成

use turso::Builder;

let db = Builder::new_local("sqlite.db").build().await?;
let conn = db.connect()?;
let res = conn.query("SELECT * FROM users", ()).await?;

亮点功能详解

向量搜索完整用法

一个完整的语义搜索示例——建表、插入 embedding、查询相似文档:

-- 创建带向量列的表
CREATE TABLE documents (
    id INTEGER PRIMARY KEY,
    name TEXT,
    content TEXT,
    embedding BLOB
);

-- 插入带预计算 embedding 的文档
INSERT INTO documents (name, content, embedding) VALUES
    ('Doc 1', 'Machine learning basics', vector32('[0.2, 0.5, 0.1, 0.8]')),
    ('Doc 2', 'Database fundamentals', vector32('[0.1, 0.3, 0.9, 0.2]')),
    ('Doc 3', 'Neural networks guide', vector32('[0.3, 0.6, 0.2, 0.7]'));

-- 余弦距离查找最相似的文档
SELECT name, content,
    vector_distance_cos(embedding, vector32('[0.25, 0.55, 0.15, 0.75]')) AS similarity
FROM documents
ORDER BY similarity
LIMIT 5;

向量操作函数也很实用:vector_concat 拼接两个向量,vector_slice 提取子向量,vector_extract 将 blob 转为可读文本。

量化向量适合大规模场景——内存省 4 倍,适合百万级向量检索:

-- 用 8-bit 量化向量存储
INSERT INTO documents (name, content, embedding) VALUES
    ('Doc 4', 'Deep learning', vector8('[0.1, 0.9, 0.3, 0.7, 0.2]'));

-- 查询时用原始精度的向量做距离计算
SELECT name, vector_distance_cos(embedding, vector32('[0.1, 0.9, 0.3, 0.7, 0.2]'))
FROM documents
ORDER BY 2
LIMIT 1;

全文检索完整用法

-- 创建带权重的 FTS 索引
CREATE INDEX fts_docs ON documents USING fts (title, content)
WITH (weights = 'title=2.0,content=1.0', tokenizer = 'ngram');

-- 搜索并排序
SELECT id, title,
    fts_score(title, content, 'SQL') as score,
    fts_highlight(content, '<b>', '</b>', 'SQL') as snippet
FROM documents
WHERE fts_match(title, content, 'SQL')
ORDER BY score DESC;

查询语法支持:database AND sql(布尔与)、"full text search"(短语搜索)、data*(前缀搜索)、title:database^2(字段过滤 + 权重提升)。

CDC 完整用法

-- 开启全量变更捕获
PRAGMA capture_data_changes_conn('full');

-- 正常操作——所有变更自动记录到 turso_cdc 表
CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT);
INSERT INTO users VALUES (1, 'John'), (2, 'Jane');
UPDATE users SET name='John Doe' WHERE id=1;
DELETE FROM users WHERE id=2;

-- 查看变更日志
SELECT * FROM turso_cdc;
-- change_id | change_type | table_name | id | before | after
-- 1         | 1 (INSERT)  | users      | 1  | NULL   | John
-- 2         | 1 (INSERT)  | users      | 2  | NULL   | Jane
-- 3         | 0 (UPDATE)  | users      | 1  | John   | John Doe
-- 4         | -1 (DELETE) | users      | 2  | Jane   | NULL

注意:full 模式下每次更新会写三次磁盘(before 状态、after 状态、WAL 值),高频更新场景要评估磁盘 I/O。

加密支持

实验性功能,支持页面级加密。两种加密算法可选:AEGIS-256 和 AES-256-GCM。

# 生成 32 字节密钥
openssl rand -hex 32

# 创建加密数据库
tursodb --experimental-encryption database.db
PRAGMA cipher = 'aegis256';
PRAGMA hexkey = '2d7a30108d3eb3e45c90a732041fe54778bdcf707c76749fab7da335d1b39c1d';

# 重新打开加密数据库必须用 URI 格式
tursodb --experimental-encryption \
  "file:database.db?cipher=aegis256&hexkey=2d7a30108d3eb3e45c90a732041fe54778bdcf707c76749fab7da335d1b39c1d"

加密是页面级的——每个页面独立加密解密,nonce 和认证标签存在页面本身的保留空间中。密钥不存储在数据库文件中,每次连接都需要提供。

社区与生态

  • 维护状态:非常活跃。18k+ commits,最近一次发版在 2026 年 5 月(v0.6.1),203 个 release
  • 贡献者规模:254 位贡献者,核心团队在 Turso 公司
  • 绑定生态:6 种语言原生绑定 + WASM + MCP Server
  • 测试体系:Deterministic Simulation Testing + Antithesis 混沌测试
  • 学术支撑:3 篇发表论文(EdgeSys、CoNEXT-SW、DBTest),研究方向是 serverless runtime 与数据库的协同设计

适用场景与局限

什么时候该用

  • AI Agent 多租户架构:每个 Agent 需要独立、隔离、快速可用的数据库
  • 嵌入式/边缘场景:设备端本地存储,离线优先,同步时再连网
  • 轻量级 RAG:embedding 存本地,向量检索在进程内完成,零网络开销
  • 需要 SQLite 兼容但嫌 SQLite 功能不够:想要并发写入、向量搜索、CDC

什么时候别用

  • 需要多进程访问:Turso 不支持。多个进程同时打开同一个数据库文件会出问题
  • 需要触发器、视图、savepoint:目前都不支持
  • MVCC 用于生产数据:还是实验性的。索引不支持、大库启动慢、查询可能返回错误结果
  • 需要 vacuum:不支持。数据库文件只增不减
  • 多线程场景:不支持。每个连接只能有一个活跃事务
  • 只用 WAL 模式就够了:WAL 模式是默认的,稳定且经过验证。MVCC 模式只在需要并发写入时才开启

结论

Turso 不是又一个”SQLite fork + 云包装”的项目。它用 Rust 从零重写了 SQLite 的核心,保留了兼容性,并发写入和向量搜索是它最硬的差异化。MVCC 还是实验性的,但方向正确——SQLite 的写入串行化问题困扰了社区二十年,Turso 第一次给出了可行的解决方案。

如果你在设计 AI Agent 的数据层,或者需要轻量级多租户数据库,Turso 值得认真评估。它不是银弹——多进程、触发器、视图的缺失是硬伤——但它解决的问题是真实的。

仓库:https://github.com/tursodatabase/turso 手册:https://github.com/tursodatabase/turso/blob/main/docs/manual.md

相关文章

AntV Infographic:让 AI 生成真正可编辑的信息图

AntV Infographic:让 AI 生成真正可编辑的信息图

痛点切入 AI 生成信息图最尴尬的地方,不是它不会画,而是它画完以后很难改。 让模型直接生成一张图片,第一眼可能还行。可一旦你想改文案、换颜色、删掉一个模块、把第二步挪到第三步,马上就进入“ ...

Cowart:为 Codex 打造的本地无限画布,让 AI 编程看见你的想法

此项目建立的初衷 AI 编程工具发展到今天,已经能读懂代码、修改文件、运行命令。但有一个问题一直没被很好解决:AI 怎么理解你的视觉意图? 你做了一个 UI 设计,想让 AI 帮你实 ...

Cell Architecture Studio:用 3D 探索细胞,开源

生物课本有一个问题。 里面的图是平的。细胞器用箭头标注,三四个箭头指向同一个位置。内质网怎么包裹细胞核、线粒体怎么在细胞质里漂浮——这些空间关系,你得盯着静态插图读一段文字来理解。 Cell Ar ...

LongCat-Video:美团开源 13.6B 视频生成模型,长视频才是真正的战场

长视频生成为什么难 你可能已经体验过不少视频生成工具——Kling、Runway、Pika、Wan2.1……5 秒的片段看起来都不错。但当你尝试生成 30 秒甚至分钟级视频时,问题就来了。 ...

Claw Code:193K 星的开源 Agent Harness,AI 编程的下一个战场

Claw Code:193K 星的开源 Agent Harness,AI 编程的下一个战场

此项目建立的初衷 过去一年,AI 编程工具的变化非常快。 最早,开发者用 AI 主要是为了补全代码。后来,AI 开始进入聊天窗口,帮我们解释代码、生成函数、排查报错、写测试用例。再后来,Cu ...

Manim 全面对比:3b1b 原版 vs 社区版,87k+39k star 的两个数学动画引擎怎么选

痛点切入 你看过 3Blue1Brown 的视频——那些丝滑的数学可视化动画,傅里叶变换在屏幕上旋转,线性代数的矩阵变换实时作用于几何图形。你想做类似的东西,但打开 PowerPoint 做不 ...