跳转至

Turso 边缘数据库

为什么要学

Turso 是基于 libSQL(SQLite 的开源 fork)的边缘嵌入式数据库:

  • 边缘部署:数据库副本分布在全球边缘节点,低延迟
  • SQLite 兼容:熟悉的 SQL 语法,零学习成本
  • 嵌入式选项:可以直接嵌入应用(embedded replicas)
  • 免费额度大:免费 9GB 存储 + 每月 5 亿行读取
  • 多租户友好:每个用户/租户可以有独立数据库
  • 开发体验好:本地开发用 SQLite 文件,生产用 Turso

适合需要低延迟、高性价比数据库的 SaaS、边缘应用和个人项目。

核心概念

概念说明类比
libSQLSQLite的开源fork(可远程访问)增强版SQLite
DatabaseTurso上的一个数据库实例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"}'

数据库分支(开发/测试)

# 从生产创建分支(用于开发)
turso db create my-app-dev --from-db my-app-db

常见问题

Q1: vs Supabase/PlanetScale?

方面TursoSupabasePlanetScale
底层libSQL(SQLite)PostgreSQLMySQL
嵌入式支持不支持不支持
边缘全球副本单区域多区域
免费9GB/5亿读500MB已关闭免费
适合低延迟/嵌入全功能后端大规模MySQL

Q2: SQLite 的限制是否适用?

  • 写入仍是单点(主节点)
  • 不支持某些 PostgreSQL 高级特性
  • 适合读多写少的场景
  • 单库大小建议 <100GB

参考资源