最近我在折腾 Turso,它正好击中了一个我之前没意识到自己想要的甜点:既有 SQLite 的简单,又有云数据库的便利。

Turso 是什么?

Turso 最初是 libSQL——一个接受开放贡献的 SQLite 分支。项目后来不断演化,官方称之为"SQLite 的下一次进化":用 Rust 从零重写,同时保持与 SQLite 完全向后兼容,还加入了原版从未有过的东西:

  • 面向 AI 和 RAG 应用的原生向量搜索
  • 基于 Linux io_uring 等现代原语的异步设计
  • 没有锁冲突的并发写入
  • 开放贡献模式——SQLite 本身虽然开源,但以不接受外部贡献而闻名

产品分为两部分:

  1. Turso Database —— 可以跑在应用里、设备上、甚至浏览器中的嵌入式引擎
  2. Turso Cloud —— 带分支、备份和分析功能的托管平台

Embedded Replica

对我来说这是杀手级功能。Embedded Replica 会在你的应用旁边保留一份云数据库的本地副本:

  • 读取直接命中本地文件,微秒级返回
  • 写入发送到云端主库,再反映回副本
  • 保证 read-your-writes 语义——写入成功后,副本立即能看到新数据,不需要显式调用 sync()

配置基本上就是两个参数:指向本地文件的 url,和指向远程数据库的 syncUrl。可以用 syncInterval 定期同步,也可以在启动时或后台任务里手动调用 sync()

这相当于数据库版的 CDN:数据放在边缘、就在你的进程里,但云端仍然有唯一的真实来源。

离线写入

默认情况下写入要发往主库,所以需要网络连接。但你可以打开离线模式(offline: true),改为本地写入,之后再同步回云端。对于移动应用或任何需要在不稳定网络下工作的场景,这正是大家一直在 SQLite 之上手工重新发明的 local-first 模式。

注意事项

  • 同步进行时不要用其他进程打开本地数据库文件,有数据损坏的风险。
  • Embedded Replica 需要真实的文件系统,所以在没有文件系统的 serverless 环境里跑不起来。

结论

SQLite 一直是我最喜欢的"开箱即用"数据库,Turso 保留了这种感觉,同时悄悄解决了总是把我推向 Postgres 的两个问题:复制和备份。SDK 覆盖 TypeScript、Go、Rust、PHP 等,接入大多数技术栈都很轻松。

如果你曾经想过"要是能直接发布 SQLite、但带同步就好了",那它值得你花一个下午试试。