Turso 边缘数据库¶
为什么要学¶
Turso 是基于 libSQL(SQLite 的开源 fork)的边缘嵌入式数据库:
- 边缘部署:数据库副本分布在全球边缘节点,低延迟
- SQLite 兼容:熟悉的 SQL 语法,零学习成本
- 嵌入式选项:可以直接嵌入应用(embedded replicas)
- 免费额度大:免费 9GB 存储 + 每月 5 亿行读取
- 多租户友好:每个用户/租户可以有独立数据库
- 开发体验好:本地开发用 SQLite 文件,生产用 Turso
适合需要低延迟、高性价比数据库的 SaaS、边缘应用和个人项目。
核心概念¶
| 概念 | 说明 | 类比 |
|---|---|---|
| libSQL | SQLite的开源fork(可远程访问) | 增强版SQLite |
| Database | Turso上的一个数据库实例 | PostgreSQL的database |
| Group | 数据库组(共享复制配置) | 数据库集群 |
| Location | 数据库副本所在的边缘节点 | CDN节点 |
| Embedded Replica | 嵌入应用的本地副本 | 本地缓存 |
| Platform API | 管理数据库的REST API | 控制面板API |
安装配置¶
# 安装CLI
curl -sSfL https://get.tur.so/install.sh | bash
# 登录
turso auth login
# 创建数据库
turso db create my-app-db
# 获取连接URL
turso db show my-app-db --url
# 创建认证token
turso db tokens create my-app-db
客户端 SDK¶
# JavaScript/TypeScript
npm install @libsql/client
# Python
pip install libsql-client
# Rust
cargo add libsql
快速上手¶
TypeScript¶
import { createClient } from '@libsql/client';
const client = createClient({
url: 'libsql://my-app-db-username.turso.io',
authToken: process.env.TURSO_AUTH_TOKEN,
});
// 创建表
await client.execute(`
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)
`);
// 插入
await client.execute({
sql: 'INSERT INTO users (name, email) VALUES (?, ?)',
args: ['张三', 'zhangsan@example.com'],
});
// 查询
const result = await client.execute('SELECT * FROM users');
console.log(result.rows);
// 批量操作(事务)
await client.batch([
{ sql: 'INSERT INTO users (name, email) VALUES (?, ?)', args: ['李四', 'lisi@example.com'] },
{ sql: 'INSERT INTO users (name, email) VALUES (?, ?)', args: ['王五', 'wangwu@example.com'] },
], 'write');
Embedded Replicas(嵌入式副本)¶
import { createClient } from '@libsql/client';
// 本地副本 + 远程同步
const client = createClient({
url: 'file:local-replica.db', // 本地文件
syncUrl: 'libsql://my-app-db-username.turso.io', // 远程同步
authToken: process.env.TURSO_AUTH_TOKEN,
syncInterval: 60, // 每60秒同步
});
// 读操作:从本地副本读(极快)
const users = await client.execute('SELECT * FROM users');
// 写操作:写入远程,然后同步到本地
await client.execute({
sql: 'INSERT INTO users (name) VALUES (?)',
args: ['新用户'],
});
// 手动同步
await client.sync();
与 Drizzle ORM 集成¶
import { drizzle } from 'drizzle-orm/libsql';
import { createClient } from '@libsql/client';
import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';
const client = createClient({
url: process.env.TURSO_DATABASE_URL!,
authToken: process.env.TURSO_AUTH_TOKEN,
});
const db = drizzle(client);
// Schema
const users = sqliteTable('users', {
id: integer('id').primaryKey({ autoIncrement: true }),
name: text('name').notNull(),
email: text('email').unique(),
});
// 类型安全查询
const allUsers = await db.select().from(users);
await db.insert(users).values({ name: '张三', email: 'z@t.com' });
进阶用法¶
多数据库(多租户)¶
# 每个租户一个数据库
turso db create tenant-001
turso db create tenant-002
# 使用Platform API管理
curl -X POST 'https://api.turso.tech/v1/organizations/{org}/databases' \
-H "Authorization: Bearer $TURSO_API_TOKEN" \
-d '{"name": "tenant-003", "group": "default"}'
数据库分支(开发/测试)¶
常见问题¶
Q1: vs Supabase/PlanetScale?¶
| 方面 | Turso | Supabase | PlanetScale |
|---|---|---|---|
| 底层 | libSQL(SQLite) | PostgreSQL | MySQL |
| 嵌入式 | 支持 | 不支持 | 不支持 |
| 边缘 | 全球副本 | 单区域 | 多区域 |
| 免费 | 9GB/5亿读 | 500MB | 已关闭免费 |
| 适合 | 低延迟/嵌入 | 全功能后端 | 大规模MySQL |
Q2: SQLite 的限制是否适用?¶
- 写入仍是单点(主节点)
- 不支持某些 PostgreSQL 高级特性
- 适合读多写少的场景
- 单库大小建议 <100GB
参考资源¶
- Turso 官网 - 官方网站
- Turso 文档 - 完整文档
- libSQL GitHub - 源代码
- Turso CLI - CLI 参考