AI

Tursoの使い方完全ガイド【インストールから応用まで】

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_URLenv.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_URLprocess.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で簡単なスクリプトを作成する場合です。

  1. プロジェクトディレクトリを作成し、初期化します。

    mkdir my-turso-app
    cd my-turso-app
    npm init -y
    
  2. Tursoクライアントライブラリをインストールします。

    npm install @libsql/client dotenv
    
  3. .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 で取得できます。

  4. 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();
    
  5. スクリプトを実行します。

    node index.js
    

コンソールにデータベースから取得したアイテムが表示されれば成功です。 この小さな一歩が、エッジコンピューティングの世界への扉を開きます。Tursoを活用して、高速でスケーラブルなアプリケーション開発を始めてみましょう。

参考文献

広告

-AI