Tursoとは?個人開発に最適な次世代SQLiteデータベースの始め方

「個人開発でデータベースを使いたいけど、PostgreSQLやMySQLはセットアップが面倒だし、料金も心配…」そんな悩みを持っている方に、ぜひ知ってほしいサービスがあります。

それが Turso(ターソ) です。

Tursoは、おなじみのSQLiteをベースにした次世代のクラウドデータベースサービスで、無料プランでもかなり実用的に使えるのが大きな魅力です。

この記事では、Tursoの基本的な仕組みから、実際にNext.jsと組み合わせてデータベースを操作するところまで、ステップバイステップで解説していきます。

目次

そもそもSQLiteって何だっけ?

Tursoを理解するには、まずSQLiteについてざっくり知っておくと話がスムーズです。

SQLiteは、世界でもっとも広く使われているデータベースエンジンです。スマートフォンのアプリやブラウザの内部など、実はみなさんも気づかないうちに日常的に使っています。

MySQLやPostgreSQLのような一般的なデータベースは、専用のサーバーを立ち上げて、そこにアプリケーションが接続しにいくという構成をとります。一方、SQLiteはファイルが1つあればそれがデータベースそのものという仕組みです。サーバーを立てる必要がなく、セットアップがとても簡単なので、個人開発やプロトタイプ制作にはぴったりの存在です。

ただし、SQLite単体にはいくつか弱点もあります。たとえば、複数のユーザーが同時に書き込むような処理には向いていなかったり、ネットワーク越しにアクセスする機能が標準ではなかったりします。Tursoは、まさにこうした弱点を補うために生まれたサービスです。

TursoとlibSQLの関係を整理しよう

Tursoを語るうえで欠かせないのが libSQL(リブ・エスキューエル) の存在です。

libSQLは、Tursoの開発チームがSQLiteをフォーク(分岐させて独自に拡張すること)して作ったオープンソースのデータベースエンジンです。SQLiteとの互換性を保ちながら、クラウド時代に必要な機能を追加しています。

具体的には、こんな機能が加わっています。

  • リモートアクセス対応 — HTTPやWebSocket経由でネットワーク越しにデータベースへ接続できる
  • レプリケーション(複製) — クラウド上のデータベースをローカルに同期して、読み取りを高速化できる
  • ベクトル検索 — AI・RAG用途で使える類似度検索を、拡張機能なしでネイティブにサポート
  • ALTER TABLEの改善 — SQLiteでは面倒だったテーブル構造の変更がスムーズに

イメージとしては、SQLiteが「手元で使える便利なメモ帳」だとしたら、libSQLは「クラウドと同期できるスマートなメモ帳」、そしてTursoは「そのメモ帳をホスティングして管理してくれるサービス」 という関係です。

Tursoが個人開発に向いている理由

では、なぜ個人開発者にとってTursoが魅力的なのでしょうか。いくつかの理由をまとめてみます。

まず無料プランが実用的です。月5億行の読み取り、1,000万行の書き込み、5GBのストレージが無料で使えます。個人開発やポートフォリオ用途であれば、これで十分すぎるほどです。しかもクレジットカードの登録も不要で、すぐに始められます。

次に、コールドスタートがないという点も大きいです。PostgreSQLベースの無料プランのデータベースサービスでは、一定時間使わないとデータベースが停止して、再起動に数秒~数十秒かかることがよくあります。Tursoの無料プランではこれがなく、常に即座にレスポンスが返ってきます。

そしてセットアップが圧倒的に簡単です。CLIを入れてコマンドを数回打つだけでデータベースが作れます。MySQLやPostgreSQLのようにDockerを用意したり、設定ファイルをいじったりする必要がありません。

さらに、Next.jsやRemix、Astro、SvelteKitといったモダンなフレームワークとの相性がとても良いです。公式ドキュメントにもこれらのフレームワーク向けのガイドが整備されています。

Tursoの料金プラン

2026年3月現在の料金プランは以下の通りです(年払いの場合)。

項目FreeDeveloper($4.99/月)Scaler($24.92/月)Pro($416.58/月)
データベース数100無制限無制限無制限
ストレージ5GB9GB24GB50GB
月間読み取り5億行25億行1,000億行2,500億行
月間書き込み1,000万行2,500万行1億行2.5億行
ポイントインタイムリストア1日10日30日90日
チーム機能××

個人開発であればFreeプランで十分ですし、プロジェクトが成長してきたらDeveloperプラン(月額約750円程度)にアップグレードすれば読み取り上限が5倍になります。課金の心配なく始められるのは安心ですね。

Turso Cloudの始め方(ハンズオン)

ここからは実際にTursoを触ってみましょう。手順はとてもシンプルです。

CLIのインストール

まずはTurso CLIをインストールします。macOS/Linuxの場合は以下のコマンドを実行してください。

bash

Bash
curl -sSfL https://get.tur.so/install.sh | bash
Bash

Windowsの場合はWSL(Windows Subsystem for Linux)環境で同じコマンドが使えます。

サインアップとログイン

CLIが入ったら、サインアップします。GitHubアカウントがあればすぐに完了します。

bash

Bash
turso auth signup
Bash

ブラウザが開いてGitHub認証を求められるので、許可すればOKです。すでにアカウントがある場合は turso auth login でログインしてください。

データベースの作成

いよいよデータベースを作ります。

bash

Bash
turso db create my-app
Bash

これだけです。数秒で、あなたの地理的に近いリージョンにデータベースが作成されます。作成できたか確認してみましょう。

bash

Bash
turso db show my-app
Bash

URLやロケーションなどの情報が表示されれば成功です。

シェルでSQLを実行してみる

作ったデータベースに直接SQLを打ち込んで試すこともできます。

bash

Bash
turso db shell my-app
Bash

シェルが起動したら、たとえばこんなふうにテーブルを作ってデータを入れてみてください。

sql

SQL
CREATE TABLE posts (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  title TEXT NOT NULL,
  content TEXT,
  created_at TEXT DEFAULT (datetime('now'))
);

INSERT INTO posts (title, content) VALUES ('最初の投稿', 'Tursoで初めてのデータベース操作です!');

SELECT * FROM posts;
SQL

結果が返ってくればばっちりです。.quit でシェルを終了できます。

Next.jsからTursoに接続してみよう

ここからが本番です。TypeScript × Next.jsの環境からTursoのデータベースを操作してみましょう。

接続情報の取得

まず、アプリケーションからTursoに接続するために必要な情報を取得します。

bash

Bash
# データベースのURLを取得
turso db show my-app --url

# 認証トークンを取得
turso db tokens create my-app
```

表示されたURLとトークンを、Next.jsプロジェクトの `.env.local` に記述します。
```
TURSO_DATABASE_URL=libsql://my-app-あなたのアカウント名.turso.io
TURSO_AUTH_TOKEN=取得したトークン文字列
Bash

パッケージのインストール

Next.jsプロジェクトに、Tursoの公式クライアントライブラリをインストールします。

bash

Bash
npm install @libsql/client
Bash

データベースクライアントの作成

src/lib/turso.ts というファイルを作って、以下のように接続設定を書きます。

typescript

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

export const turso = createClient({
  url: process.env.TURSO_DATABASE_URL!,
  authToken: process.env.TURSO_AUTH_TOKEN,
});
TypeScript

たったこれだけで接続準備は完了です。MySQLやPostgreSQLのセットアップと比べると、驚くほどシンプルですよね。

Server Componentからデータを取得する

Next.jsのApp Router(Server Components)を使って、先ほど作ったpostsテーブルのデータを取得してみましょう。

typescript

TypeScript
// src/app/posts/page.tsx
import { turso } from "@/lib/turso";

export default async function PostsPage() {
  const result = await turso.execute("SELECT * FROM posts ORDER BY created_at DESC");

  return (
    <div>
      <h1>投稿一覧</h1>
      <ul>
        {result.rows.map((post) => (
          <li key={String(post.id)}>
            <h2>{String(post.title)}</h2>
            <p>{String(post.content)}</p>
          </li>
        ))}
      </ul>
    </div>
  );
}
TypeScript

Server Componentなのでクライアント側に認証トークンが漏れる心配もなく、安全にデータベースへアクセスできます。

データを挿入する(Server Actions)

データの書き込みにはServer Actionsを使います。

typescript

TypeScript
// src/app/posts/actions.ts
"use server";

import { turso } from "@/lib/turso";

export async function createPost(formData: FormData) {
  const title = formData.get("title") as string;
  const content = formData.get("content") as string;

  await turso.execute({
    sql: "INSERT INTO posts (title, content) VALUES (?, ?)",
    args: [title, content],
  });
}
TypeScript

ポイントは execute メソッドにSQLとパラメータを渡す書き方です。? のプレースホルダーを使って args で値を渡すことで、SQLインジェクション(不正なSQL文を注入する攻撃)を防いでいます。

Tursoを使うときの注意点

便利なTursoですが、使い方によっては「あれ?」となるポイントもあります。よくある落とし穴をNG/OKの例とともに紹介します。

同時書き込みの制限を理解しておこう

TursoはSQLiteベースなので、同時に大量の書き込みが発生するユースケースには向いていません。たとえば、リアルタイムチャットで毎秒何百件もメッセージが書き込まれるようなアプリには不向きです。

NG例: リアルタイムチャットアプリで、全ユーザーの発言を1つのTursoデータベースに同時書き込みする

OK例: ブログ、ポートフォリオサイト、ToDoアプリなど、読み取りが中心で書き込み頻度が低いアプリケーション

SQLの直書きには注意

先ほどのコード例でも触れましたが、ユーザーの入力値をSQL文に直接埋め込むのは絶対にNGです。

NG例:

typescript

TypeScript
// 絶対にやってはいけない!
await turso.execute(`INSERT INTO posts (title) VALUES ('${userInput}')`);
TypeScript

OK例:

typescript

TypeScript
// プレースホルダーを使う
await turso.execute({
  sql: "INSERT INTO posts (title) VALUES (?)",
  args: [userInput],
});
TypeScript

これはTursoに限った話ではなく、すべてのデータベース操作における鉄則です。テンプレートリテラルで直接値を埋め込むと、悪意のある入力でデータベースが破壊される可能性があります。

環境変数の扱いに気をつける

Next.jsでは、NEXT_PUBLIC_ で始まる環境変数はクライアント(ブラウザ)に公開されます。データベースの認証トークンは絶対にクライアント側に公開してはいけません。

NG例: .env.localNEXT_PUBLIC_TURSO_AUTH_TOKEN=... と定義する

OK例: TURSO_AUTH_TOKEN=... のように NEXT_PUBLIC_ を付けず、Server ComponentsやServer Actionsの中でのみ使う


他のデータベースサービスとの比較

「Tursoは分かったけど、他のサービスと何が違うの?」という方のために、個人開発でよく使われるサービスとの比較表を用意しました。

項目TursoSupabasePlanetScaleCloudflare D1
ベースのDBSQLite(libSQL)PostgreSQLMySQLSQLite
無料プランの有無×(2024年に廃止)
コールドスタートなしあり(無料プラン)なし
セットアップの手軽さとても簡単簡単普通簡単(要Cloudflareアカウント)
トランザクション制限あり
エッジ対応○(Embedded Replicas)×
向いている用途個人開発・軽量アプリ・AIエージェントフルスタックアプリ大規模WebサービスCloudflareエコシステム内のアプリ

ざっくり言うと、Tursoは「軽くてシンプルに始めたい個人開発者」にもっともフィットするポジションです。一方で、認証やストレージなどデータベース以外の機能もまとめて欲しい場合はSupabaseが選択肢に入りますし、Cloudflareの他のサービス(Workers、Pages等)をすでに使っている場合はD1も良い選択です。


まとめ

この記事では、Tursoの基本的な仕組みからNext.jsでの実装方法まで、ひと通り解説してきました。

おさらいすると、TursoはSQLiteをベースにした軽量なクラウドデータベースサービスで、無料プランでも十分実用的に使えます。CLIでの操作もシンプルですし、Next.jsとの連携もわずか数行のコードで完結します。

特にこんな方にTursoはおすすめです。

  • ポートフォリオや個人開発でサクッとデータベースを使いたい方
  • PostgreSQLやMySQLのセットアップに疲れてしまった方
  • Next.jsやAstroなどのモダンなフレームワークでアプリを作っている方
  • まずは無料で始めて、必要に応じてスケールしたい方

SQLiteの手軽さと、クラウドデータベースの便利さを両立したTurso。次のプロジェクトで、ぜひ試してみてください。

あざした

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次