Turso & libSQL - SQLiteのエッジ対応版

2024.12.30

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による超低レイテンシの読み取りは、特にエッジ環境でのアプリケーションに最適です。

← 一覧に戻る