Tursoの使い方完全ガイド【インストールから応用まで】
ウェブアプリケーションやIoTデバイスがますます身近になり、データの発生源は多様化しています。従来のデータベースでは、ユーザーとデータベースの物理的な距離が離れていると、データ取得に時間がかかりがちでした。これはユーザー体験を損ねる大きな要因の一つです。
例えば、グローバルに展開するECサイトを考えてみましょう。日本のユーザーが商品情報を閲覧しようとすると、米国のデータセンターにあるデータベースにアクセスするまでに、どうしても通信の遅延が発生します。これにより、ページの表示が遅れたり、操作にタイムラグが生じたりする可能性があります。このような状況では、ユーザーはストレスを感じ、サイトから離れてしまうかもしれません。
しかし、もしデータがユーザーのすぐ近くに存在したらどうでしょうか。通信距離が短縮され、データアクセスは劇的に高速化します。ユーザーはストレスなくアプリケーションを利用でき、開発者はパフォーマンスの最適化に費やす時間を、より本質的な機能開発に充てられます。この理想を実現するのが、エッジコンピューティングに最適化されたデータベース「Turso」です。
本記事では、Tursoの基本的な使い方から、実際の開発で役立つ応用例までを詳しく解説します。
Tursoとは
Tursoは、SQLite互換の分散型データベースです。Rust言語でゼロから再実装されており、エッジ環境やサーバーレス環境での利用に特化しています。従来のSQLiteが持つ手軽さに加え、分散型データベースとしての強力な機能を提供します。
Tursoの大きな特徴は、並行書き込みと双方向同期のサポートです。これにより、複数の場所から同時にデータを書き込んでも競合を気にせず、常に最新の状態を保てます。さらに、オフラインでのデータ操作と、オンライン時の自動同期も可能です。これは、ネットワーク接続が不安定なモバイルアプリケーションやIoTデバイスにとって非常に強力な機能です。
Tursoは、SQLiteのオープンソースフォークであるlibSQLプロジェクトから派生しています。libSQLはSQLiteを拡張し、組み込みレプリカやリモートアクセス機能を提供します。一方、TursoはlibSQLの思想を受け継ぎつつ、さらに一歩進んだ完全に新しい実装です。並行書き込みや高度な同期機能は、TursoがRustで再実装されたことによって実現されました。
新しいプロジェクトでは、libSQLよりもTursoの利用が推奨されています。Tursoは、エッジコンピューティング時代におけるデータ処理の課題を解決するために誕生しました。
インストール方法
Tursoを利用するには、Turso CLI(コマンドラインインターフェース)をインストールするのが最も簡単です。Turso CLIは、データベースの作成、管理、接続など、すべての操作をコマンドラインから行えます。
macOS/Linuxの場合
macOSまたはLinux環境では、以下のコマンドでTurso CLIをインストールできます。
curl -sSfL https://get.tur.so/install.sh | bash
Homebrewを使用している場合は、以下のコマンドでもインストール可能です。
brew install turso/turso/turso
Windowsの場合
Windows環境では、Scoopパッケージマネージャーを使用するのが便利です。
まず、PowerShellを開き、Scoopをインストールします。
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser # 最初に実行が必要な場合があります
irm get.scoop.sh | iex
Scoopがインストールできたら、Turso CLIを追加します。
scoop bucket add turso https://github.com/tursodatabase/scoop-bucket
scoop install turso
または、WSL (Windows Subsystem for Linux) を使用して、Linuxのインストール手順に従うこともできます。
インストール後の設定
Turso CLIのインストールが完了したら、Tursoアカウントにログインします。
turso auth login
このコマンドを実行すると、ウェブブラウザが開き、Tursoアカウントへのログインが求められます。ログインが成功すると、CLIが認証され、Tursoの各種機能を利用できるようになります。
基本的な使い方
Turso CLIを使って、データベースの作成からデータ操作までを体験してみましょう。
1. データベースの作成
最初にTursoのデータベースを作成します。例えば、my-first-db という名前のデータベースを作成する場合です。
turso db create my-first-db
このコマンドは、Tursoのインフラストラクチャ上に新しいデータベースインスタンスをプロビジョニングします。
2. データベース一覧の確認
作成したデータベースや、既存のデータベースを一覧表示できます。
turso db list
これにより、データベースの名前、地域、状態などが表示されます。
3. データベースへの接続(CLIシェル)
作成したデータベースに直接SQLシェルで接続できます。これにより、SQLコマンドを実行してデータ操作を試せます。
turso db shell my-first-db
シェルに接続すると、通常のSQLiteと同様にSQLコマンドを入力できます。
例えば、users テーブルを作成し、データを挿入してみましょう。
CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, email TEXT UNIQUE);
INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');
INSERT INTO users (name, email) VALUES ('Bob', 'bob@example.com');
SELECT * FROM users;
操作が終わったら、.quit と入力してシェルを終了します。
4. 接続URLと認証トークンの取得
アプリケーションからTursoデータベースに接続するためには、接続URLと認証トークンが必要です。
データベースの接続URLを取得します。
turso db show my-first-db --url
出力されるURLは、libsql://<your-db-name>-<your-organization>.turso.io のような形式です。
次に、認証トークンを作成します。このトークンを使ってアプリケーションからデータベースに安全にアクセスします。
turso db tokens create my-first-db
このコマンドは、アクセス権限を持つ新しいトークンを生成します。生成されたトークンは大切に保管してください。
便利な使い方・応用例 3選
Tursoの真価は、エッジコンピューティングとサーバーレス環境での利用にあります。ここでは、実際の開発シーンに落とし込んだ応用例を3つ紹介します。
1. グローバルエッジレプリカの活用
Tursoの最も強力な機能の一つは、データベースのエッジレプリカを簡単に作成できることです。エッジレプリカとは、データベースのコピーを世界中の異なるリージョン(地域)に配置する機能です。これにより、ユーザーは最も近いレプリカにアクセスでき、データ取得のレイテンシを最小限に抑えられます。
例えば、my-global-app というデータベースを最初に米国東部(ewr)に作成したとします。
turso db create my-global-app --region ewr
次に、日本(hnd)にもレプリカを作成します。
turso db replicate my-global-app hnd
これにより、my-global-app は米国と日本の両方に存在し、ユーザーは地理的に近い方のデータベースにアクセスできます。読み取りは近くのレプリカから行われ、書き込みはプライマリレプリカ(この例ではewr)に同期されます。
この機能は、グローバルにユーザーを持つSaaSアプリケーションや、地域ごとに最適化されたコンテンツを提供するサービスに非常に有効です。
2. サーバーレス関数との連携
Tursoは、Cloudflare WorkersやVercel Edge Functionsのようなサーバーレス関数と非常に相性が良いです。これらの関数はユーザーに近いエッジで実行されるため、Tursoのエッジレプリカと組み合わせることで、超低レイテンシのデータ処理を実現できます。
以下は、JavaScript/TypeScriptでCloudflare WorkersからTursoデータベースに接続し、データを取得する例です。@libsql/client はTursoの公式JavaScriptクライアントです。
// worker.js (Cloudflare Workers)
import { createClient } from "@libsql/client";
export default {
async fetch(request, env) {
const client = createClient({
url: env.TURSO_DATABASE_URL, // 環境変数から取得
authToken: env.TURSO_AUTH_TOKEN, // 環境変数から取得
});
try {
// データベースからユーザー名を取得する例
const rs = await client.execute("SELECT name FROM users LIMIT 1");
const userName = rs.rows.length > 0 ? rs.rows[0].name : "No user found";
return new Response(`Hello, ${userName}!`);
} catch (error) {
console.error("Database error:", error);
return new Response("Error connecting to database.", { status: 500 });
}
},
};
このコードでは、env.TURSO_DATABASE_URL と env.TURSO_AUTH_TOKEN をCloudflare Workersの環境変数として設定する必要があります。これにより、サーバーレス関数がエッジで実行される際に、最も近いTursoレプリカに高速にアクセスできます。
3. オフライン対応と双方向同期
Tursoは、モバイルアプリケーションやデスクトップアプリケーションのオフライン対応にも強みを発揮します。ローカルに埋め込まれたデータベース(例えばlibSQLの組み込みレプリカ)と、Tursoクラウドのデータベース間で双方向の同期が可能です。
例えば、モバイルアプリのユーザーがネットワーク接続がない場所でデータを操作したとします。その操作はまずローカルのデータベースに保存されます。その後、ネットワーク接続が回復すると、Tursoは自動的にローカルの変更をクラウドに同期し、クラウドの最新の変更をローカルにプルします。これにより、データの一貫性を保ちつつ、オフラインでのユーザー体験を損ねません。
この機能は、フィールドワークを行う業務アプリや、ネットワーク環境が不安定な地域で利用されるアプリケーション開発において、非常に有効なアプローチとなります。開発者は複雑な同期ロジックを自前で実装する手間を省き、Tursoに任せられます。
他ツールとの組み合わせ
Tursoはその柔軟性から、様々な開発スタックと組み合わせられます。
フロントエンドフレームワークとホスティング
- Next.js / Vercel: Next.jsのAPIルートやVercelのEdge Functionsは、Tursoのエッジレプリカと相性抜群です。ユーザーに近い場所でデータ処理を行うことで、アプリケーション全体のパフォーマンスを向上させます。
- Remix / SvelteKit: これらのフレームワークも、サーバーサイドレンダリングやエッジでのデータ取得を重視しており、Tursoとの連携で高速なレスポンスを実現できます。
- Cloudflare Pages / Workers: Cloudflareのグローバルネットワーク上で動作するアプリケーションとTursoを組み合わせることで、真に分散されたアーキテクチャを構築できます。
ORマッパー / クエリビルダー
- Drizzle ORM: TypeScriptフレンドリーなORマッパーであり、Turso (libSQLクライアント) との連携がスムーズです。型安全なデータベース操作を実現できます。
- Kysely: SQLクエリビルダーとしても人気があり、TursoのSQLite互換性により、複雑なクエリも安全かつ効率的に構築できます。
例: Next.js API Routes と Turso の組み合わせ
Next.jsのAPIルートでTursoを利用する例です。
// pages/api/users.ts (Next.js API Route)
import { createClient } from "@libsql/client";
import type { NextApiRequest, NextApiResponse } from "next";
export default async function handler(
req: NextApiRequest,
res: NextApiResponse
) {
// 環境変数からTursoの接続情報を取得
const client = createClient({
url: process.env.TURSO_DATABASE_URL!,
authToken: process.env.TURSO_AUTH_TOKEN!,
});
if (req.method === "GET") {
try {
const rs = await client.execute("SELECT id, name, email FROM users");
res.status(200).json(rs.rows);
} catch (error) {
console.error("Failed to fetch users:", error);
res.status(500).json({ error: "Failed to fetch users" });
}
} else if (req.method === "POST") {
const { name, email } = req.body;
if (!name || !email) {
return res.status(400).json({ error: "Name and email are required" });
}
try {
await client.execute({
sql: "INSERT INTO users (name, email) VALUES (?, ?)",
args: [name, email],
});
res.status(201).json({ message: "User created successfully" });
} catch (error) {
console.error("Failed to create user:", error);
res.status(500).json({ error: "Failed to create user" });
}
} else {
res.setHeader("Allow", ["GET", "POST"]);
res.status(405).end(`Method ${req.method} Not Allowed`);
}
}
この例では、process.env.TURSO_DATABASE_URL と process.env.TURSO_AUTH_TOKEN をプロジェクトの.envファイルに設定します。Vercelなどのホスティングサービスにデプロイする際も、これらの環境変数を設定することで、Tursoデータベースに安全に接続できます。
よくある設定・カスタマイズ
Turso自体に直接的な「dotfiles」のような設定ファイルはありませんが、プロジェクトレベルでの設定や環境変数の管理が重要になります。
環境変数の管理
Tursoの接続情報(URLと認証トークン)は、アプリケーションのコードに直接埋め込むべきではありません。セキュリティ上の理由から、環境変数として管理するのが一般的です。
プロジェクトのルートに.envファイルを作成し、以下のように記述します。
TURSO_DATABASE_URL="libsql://your-db-name-your-organization.turso.io?authToken=your-auth-token"
TURSO_AUTH_TOKEN="your-auth-token"
または、URLとトークンを別々に定義し、コード内で組み合わせる方法もあります。
TURSO_DATABASE_URL="libsql://your-db-name-your-organization.turso.io"
TURSO_AUTH_TOKEN="your-auth-token"
アプリケーションのデプロイ先(Vercel, Cloudflare, Netlifyなど)では、それぞれのプラットフォームが提供する環境変数設定機能を使って、これらの値を安全に設定してください。
認証トークンの権限管理
turso db tokens create コマンドで生成されるトークンは、デフォルトでデータベースへのフルアクセス権限を持ちます。本番環境では、アプリケーションの役割に応じて、より制限された権限を持つトークンを発行することを検討してください。
例えば、読み取り専用のトークンを発行する場合です。
turso db tokens create my-db --read-only
これにより、アプリケーションが誤って重要なデータを書き換えたり削除したりするリスクを軽減できます。
CLIのプロファイル管理
複数のTursoアカウントや組織を使い分ける場合、Turso CLIはプロファイル機能を提供します。これにより、異なる認証情報を切り替えて利用できます。
turso auth login --profile my-second-account
プロファイルを切り替えるには、TURSO_API_TOKEN 環境変数を設定するか、コマンド実行時に --profile オプションを使用します。
今日からできる実行プラン
Tursoの導入は非常に簡単です。以下の3つのステップで、今日からエッジデータベースの力を体験できます。
ステップ1: Turso CLIのインストールとアカウント作成
まず、Turso CLIをあなたの開発環境にインストールします。
curl -sSfL https://get.tur.so/install.sh | bash
インストール後、Tursoアカウントにログインします。
turso auth login
ブラウザが開き、ログイン手続きを完了してください。
ステップ2: 最初のデータベースを作成し、CLIで接続してみる
ログインが完了したら、新しいTursoデータベースを作成します。
turso db create my-edge-app-db
作成したデータベースにSQLシェルで接続し、簡単なテーブル作成とデータ挿入を試してみましょう。
turso db shell my-edge-app-db
シェル内で以下のSQLを実行します。
CREATE TABLE items (id INTEGER PRIMARY KEY, name TEXT NOT NULL);
INSERT INTO items (name) VALUES ('Apple'), ('Banana'), ('Orange');
SELECT * FROM items;
.quit
これで、Tursoデータベースが正常に動作していることを確認できます。
ステップ3: 好きな言語でTursoに接続する簡単なアプリケーションを開発してみる
次に、お好みのプログラミング言語(JavaScript/TypeScript、Python、Goなど)のTursoクライアントライブラリをプロジェクトに追加します。
例えば、Node.jsで簡単なスクリプトを作成する場合です。
プロジェクトディレクトリを作成し、初期化します。
mkdir my-turso-app cd my-turso-app npm init -yTursoクライアントライブラリをインストールします。
npm install @libsql/client dotenv.envファイルを作成し、データベースURLとトークンを記述します。TURSO_DATABASE_URL="libsql://my-edge-app-db-<your-organization>.turso.io" TURSO_AUTH_TOKEN="<ステップ2で取得したトークン>"トークンは
turso db tokens create my-edge-app-dbで取得できます。index.jsファイルを作成し、以下のコードを記述します。// index.js require('dotenv').config(); const { createClient } = require('@libsql/client'); async function main() { const client = createClient({ url: process.env.TURSO_DATABASE_URL, authToken: process.env.TURSO_AUTH_TOKEN, }); try { const rs = await client.execute("SELECT id, name FROM items"); console.log("Items from Turso:", rs.rows); } catch (error) { console.error("Error connecting to Turso:", error); } finally { // 必要に応じて接続を閉じる処理 } } main();スクリプトを実行します。
node index.js
コンソールにデータベースから取得したアイテムが表示されれば成功です。 この小さな一歩が、エッジコンピューティングの世界への扉を開きます。Tursoを活用して、高速でスケーラブルなアプリケーション開発を始めてみましょう。
参考文献
- Turso 公式ドキュメント
- libSQL GitHub リポジトリ
- Turso Blog & Tutorials
- libSQL Client for JavaScript/TypeScript GitHub