Tursoとは
Tursoは、libSQL(SQLiteのフォーク)をベースにしたエッジデータベースサービスです。SQLiteの軽量さとエッジロケーションでのレプリケーションを組み合わせ、超低レイテンシのデータアクセスを実現します。
libSQLとは
libSQLは、SQLiteをフォークしたオープンソースプロジェクトです。SQLiteの互換性を維持しながら、レプリケーション、WebSocket、HTTP対応などの機能を追加しています。
特徴
✓ SQLite互換
✓ エッジレプリケーション
✓ Embedded Replicas(アプリ内SQLite)
✓ 低レイテンシ(エッジ近接)
✓ サーバーレス最適化
✓ 寛大な無料枠
セットアップ
Turso CLI
# インストール
curl -sSfL https://get.tur.so/install.sh | bash
# ログイン
turso auth login
# データベース作成
turso db create my-app
# シェルで接続
turso db shell my-app
JavaScript/TypeScript
import { createClient } from '@libsql/client';
const client = createClient({
url: 'libsql://my-app-username.turso.io',
authToken: process.env.TURSO_AUTH_TOKEN
});
// クエリ実行
const result = await client.execute('SELECT * FROM users');
// パラメータ付きクエリ
const user = await client.execute({
sql: 'SELECT * FROM users WHERE id = ?',
args: [1]
});
// トランザクション
const tx = await client.transaction('write');
await tx.execute('INSERT INTO users (name) VALUES (?)', ['Alice']);
await tx.execute('INSERT INTO users (name) VALUES (?)', ['Bob']);
await tx.commit();
Embedded Replicas
アプリケーション内にSQLiteレプリカを持ち、超高速な読み取りを実現します。
import { createClient } from '@libsql/client';
const client = createClient({
url: 'file:local.db', // ローカルレプリカ
syncUrl: 'libsql://my-app-username.turso.io', // リモートプライマリ
authToken: process.env.TURSO_AUTH_TOKEN,
syncInterval: 60 // 60秒ごとに同期
});
// ローカルレプリカから読み取り(超高速)
const users = await client.execute('SELECT * FROM users');
// 同期を明示的に実行
await client.sync();
Embedded Replicasの利点
読み取りレイテンシ:
- リモートDB: 50-100ms
- Embedded Replica: 1-5ms
ユースケース:
- Cloudflare Workers
- Vercel Edge Functions
- モバイルアプリ
- デスクトップアプリ
Drizzle ORMとの統合
// schema.ts
import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';
export const users = sqliteTable('users', {
id: integer('id').primaryKey({ autoIncrement: true }),
name: text('name').notNull(),
email: text('email').notNull().unique()
});
// db.ts
import { drizzle } from 'drizzle-orm/libsql';
import { createClient } from '@libsql/client';
import * as schema from './schema';
const client = createClient({
url: process.env.TURSO_DATABASE_URL!,
authToken: process.env.TURSO_AUTH_TOKEN
});
export const db = drizzle(client, { schema });
// 使用
const allUsers = await db.select().from(users);
エッジロケーション
Tursoのエッジロケーション:
- 北米: 10+
- ヨーロッパ: 10+
- アジア: 5+
- オセアニア: 2+
→ ユーザーに最も近いロケーションから応答
グループ設定
# ロケーショングループを作成
turso group create my-group --location nrt # 東京
# データベースをグループに追加
turso db create my-db --group my-group
# レプリカを追加
turso group locations add my-group sin # シンガポール
turso group locations add my-group lax # ロサンゼルス
ブランチ機能
# ブランチを作成
turso db create my-db --from-db production-db
# ブランチで開発・テスト
turso db shell my-db
# テスト用データを投入...
# 本番にマージ(手動)
Cloudflare Workersでの使用
// wrangler.toml
// [vars]
// TURSO_URL = "libsql://my-app-username.turso.io"
// src/index.ts
import { createClient } from '@libsql/client/web';
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const client = createClient({
url: env.TURSO_URL,
authToken: env.TURSO_AUTH_TOKEN
});
const result = await client.execute('SELECT * FROM users LIMIT 10');
return Response.json(result.rows);
}
};
料金
無料プラン:
- 9GB ストレージ
- 5億行読み取り/月
- 500万行書き込み/月
- 500データベース
Pro プラン ($29/月):
- 24GB ストレージ
- 無制限読み取り
- 無制限データベース
まとめ
Tursoは、SQLiteの軽量さとエッジコンピューティングの利点を組み合わせたデータベースサービスです。Embedded Replicasによる超低レイテンシの読み取りは、特にエッジ環境でのアプリケーションに最適です。
← 一覧に戻る