SuperAPI AI 工具集

turso-libsql

数据与分析

查看项目

更新于 10-16 03:19

技能介绍

用途

本技能在用户提出“连接 Turso”“使用 libSQL”“搭建 Turso 数据库”“用 TypeScript 查询 Turso”等需求时使用,提供 Turso 与 libSQL 的使用指导。

Turso 是基于 libSQL 的 SQLite 兼容托管数据库平台。libSQL 是 SQLite 的生产级、开放贡献分支,新增原生向量搜索、扩展与异步 I/O,同时保持与 SQLite 完全向后兼容。

libSQL 与 Turso Database 的区别:libSQL 是 Turso Cloud 当前使用的久经考验的分支;Turso Database 是从零重写、针对极高密度与并发写入优化的版本(目前处于 beta)。对于工作负载稳定的新项目,通过 Turso Cloud 使用 libSQL;对于面向智能体、端侧或高密度场景的新项目,可考虑 Turso Database。

主要能力

  • 连接 Turso:支持 libsql://(基于 WebSocket,适合持久连接)、https://(基于 HTTP,适合单次无服务器查询)、file:(本地 SQLite 文件,无需 authToken)、:memory:(测试用内存数据库)。
  • 执行查询:支持简单查询、位置占位符(?)与命名占位符(:name),返回 ResultSet 包含 rows、columns、rowsAffected、lastInsertRowid。
  • 事务:批量事务(多语句写入首选,原子执行,任一失败则整体回滚)与交互式事务(写入决策依赖同一事务内读取时使用;交互式事务会锁定数据库最多 5 秒,尽量优先批量事务)。事务模式包括 write(BEGIN IMMEDIATE,读写混合)、read(BEGIN TRANSACTION READONLY,只读,可在副本上并行)、deferred(BEGIN DEFERRED,事先不确定,若有写入进行中可能失败)。
  • 本地开发:通过环境变量在本地与远程之间透明切换;可用 turso dev --db-file local.db 运行带 libSQL 特性的本地服务器(连接地址 http://127.0.0.1:8080)。
  • 嵌入式副本:将远程 Turso 数据库同步到本地文件,读取为微秒级本地速度,写入发往远程主库并立即在本地体现(读己之写语义)。适用于长期运行的 VM/VPS 部署、需要离线本地数据的移动应用、有文件系统访问的边缘部署;不适用于无持久文件系统的无服务器环境(改用 https://)或多个并发进程写同一本地文件(有损坏风险)。
  • 向量搜索:libSQL 内置原生向量搜索,无需扩展。使用 F32_BLOB 存储嵌入,可创建基于 DiskANN 的 ANN 向量索引,支持 vector32 插入与 vector_top_k 查询最近邻。
  • 认证与安全:可通过 CLI 生成限定范围的 auth token(turso db tokens create <db-name>、turso group tokens create <group-name>),支持令牌轮换(turso db tokens invalidate <db-name>)、JWKS 集成(让 Clerk、Auth0 等认证提供方直接签发令牌)以及细粒度权限限制到特定表或操作。

使用方式

安装:

# TypeScript / JavaScript
npm install @libsql/client

# Python
pip install libsql-client

# Rust (Cargo.toml)
# libsql = "0.6"

# Go
# go get github.com/tursodatabase/go-libsql

连接 Turso(始终从环境变量加载凭据,切勿硬编码令牌):

import { createClient } from "@libsql/client";

const client = createClient({
  url: process.env.TURSO_DATABASE_URL!,    // libsql://[DB]-[ORG].turso.io
  authToken: process.env.TURSO_AUTH_TOKEN!, // JWT from Turso CLI or Platform API
});

执行查询(始终使用参数化查询,切勿将用户输入拼接进 SQL 字符串):

// Simple query
const result = await client.execute("SELECT * FROM users");

// Positional placeholders (preferred for brevity)
const user = await client.execute({
  sql: "SELECT * FROM users WHERE id = ?",
  args: [userId],
});

// Named placeholders
const inserted = await client.execute({
  sql: "INSERT INTO users (name, email) VALUES (:name, :email)",
  args: { name: "Iku", email: "iku@example.com" },
});

批量事务:

await client.batch(
  [
    { sql: "INSERT INTO orders (user_id) VALUES (?)", args: [userId] },
    { sql: "UPDATE inventory SET stock = stock - 1 WHERE id = ?", args: [itemId] },
  ],
  "write",
);

交互式事务:

const tx = await client.transaction("write");
try {
  const { rows } = await tx.execute({
    sql: "SELECT balance FROM accounts WHERE id = ?",
    args: [accountId],
  });
  if ((rows[0].balance as number) >= amount) {
    await tx.execute({
      sql: "UPDATE accounts SET balance = balance - ? WHERE id = ?",
      args: [amount, accountId],
    });
    await tx.commit();
  } else {
    await tx.rollback();
  }
} catch (e) {
  await tx.rollback();
  throw e;
}

本地开发环境变量切换:

// .env.local
TURSO_DATABASE_URL=file:local.db
// No TURSO_AUTH_TOKEN needed for local files

// .env.production
TURSO_DATABASE_URL=libsql://my-db-myorg.turso.io
TURSO_AUTH_TOKEN=eyJ...

嵌入式副本:

const client = createClient({
  url: "file:replica.db",         // local file path
  syncUrl: process.env.TURSO_DATABASE_URL!,
  authToken: process.env.TURSO_AUTH_TOKEN!,
  syncInterval: 60,               // auto-sync every 60 seconds (optional)
});

// Manually trigger sync
await client.sync();

向量搜索:

-- Schema
CREATE TABLE documents (
  id    INTEGER PRIMARY KEY,
  text  TEXT,
  embedding F32_BLOB(1536)  -- match your embedding model's dimensions
);

-- Create vector index (DiskANN-based ANN search)
CREATE INDEX documents_idx ON documents (libsql_vector_idx(embedding));

-- Insert with embedding
INSERT INTO documents (text, embedding)
VALUES ('Hello world', vector32('[0.1, 0.2, ...]'));

-- Query top-K nearest neighbors
SELECT d.id, d.text
FROM vector_top_k('documents_idx', vector32('[0.1, 0.2, ...]'), 5)
JOIN documents d ON d.rowid = id;

CLI 快速参考:

turso auth login                          # authenticate
turso db create my-db                    # create database
turso db show my-db                      # show URL and metadata
turso db tokens create my-db             # create auth token
turso db shell my-db                     # interactive SQL shell
turso db inspect my-db                   # storage stats and top queries
turso dev --db-file local.db             # local libSQL server

适用场景

  • 需要 SQLite 兼容的托管数据库,并希望使用向量搜索、嵌入式副本等增强能力。
  • 在 TypeScript/JavaScript、Python、Rust、Go 项目中连接并查询 Turso。
  • 需要本地开发与远程生产环境透明切换。
  • 长期运行的服务器、移动应用或边缘部署需要本地低延迟读取与离线能力。
  • 需要为数据库连接配置限定范围的认证令牌与细粒度权限。

限制

  • 交互式事务会锁定数据库最多 5 秒,应尽量优先使用批量事务。
  • 嵌入式副本不适用于无持久文件系统的无服务器环境,也不适用于多个并发进程写同一本地文件。
  • Turso Database 目前处于 beta。
  • 关于索引设置、距离函数、RAG 查询模式、同步策略、静态加密、部署指南、令牌范围、JWKS 设置与安全清单等更多细节,资料指向 references/connection-and-auth.md、references/vector-search.md、references/embedded-replicas.md 等参考文件,具体内容暂未提供。