「個人開発でデータベースを使いたいけど、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月現在の料金プランは以下の通りです(年払いの場合)。
| 項目 | Free | Developer($4.99/月) | Scaler($24.92/月) | Pro($416.58/月) |
|---|---|---|---|---|
| データベース数 | 100 | 無制限 | 無制限 | 無制限 |
| ストレージ | 5GB | 9GB | 24GB | 50GB |
| 月間読み取り | 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
curl -sSfL https://get.tur.so/install.sh | bashBashWindowsの場合はWSL(Windows Subsystem for Linux)環境で同じコマンドが使えます。
サインアップとログイン
CLIが入ったら、サインアップします。GitHubアカウントがあればすぐに完了します。
bash
turso auth signupBashブラウザが開いてGitHub認証を求められるので、許可すればOKです。すでにアカウントがある場合は turso auth login でログインしてください。
データベースの作成
いよいよデータベースを作ります。
bash
turso db create my-appBashこれだけです。数秒で、あなたの地理的に近いリージョンにデータベースが作成されます。作成できたか確認してみましょう。
bash
turso db show my-appBashURLやロケーションなどの情報が表示されれば成功です。
シェルでSQLを実行してみる
作ったデータベースに直接SQLを打ち込んで試すこともできます。
bash
turso db shell my-appBashシェルが起動したら、たとえばこんなふうにテーブルを作ってデータを入れてみてください。
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
# データベースの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
npm install @libsql/clientBashデータベースクライアントの作成
src/lib/turso.ts というファイルを作って、以下のように接続設定を書きます。
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
// 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>
);
}TypeScriptServer Componentなのでクライアント側に認証トークンが漏れる心配もなく、安全にデータベースへアクセスできます。
データを挿入する(Server Actions)
データの書き込みにはServer Actionsを使います。
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
// 絶対にやってはいけない!
await turso.execute(`INSERT INTO posts (title) VALUES ('${userInput}')`);TypeScriptOK例:
typescript
// プレースホルダーを使う
await turso.execute({
sql: "INSERT INTO posts (title) VALUES (?)",
args: [userInput],
});TypeScriptこれはTursoに限った話ではなく、すべてのデータベース操作における鉄則です。テンプレートリテラルで直接値を埋め込むと、悪意のある入力でデータベースが破壊される可能性があります。
環境変数の扱いに気をつける
Next.jsでは、NEXT_PUBLIC_ で始まる環境変数はクライアント(ブラウザ)に公開されます。データベースの認証トークンは絶対にクライアント側に公開してはいけません。
NG例: .env.local で NEXT_PUBLIC_TURSO_AUTH_TOKEN=... と定義する
OK例: TURSO_AUTH_TOKEN=... のように NEXT_PUBLIC_ を付けず、Server ComponentsやServer Actionsの中でのみ使う
他のデータベースサービスとの比較
「Tursoは分かったけど、他のサービスと何が違うの?」という方のために、個人開発でよく使われるサービスとの比較表を用意しました。
| 項目 | Turso | Supabase | PlanetScale | Cloudflare D1 |
|---|---|---|---|---|
| ベースのDB | SQLite(libSQL) | PostgreSQL | MySQL | SQLite |
| 無料プランの有無 | ○ | ○ | ×(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。次のプロジェクトで、ぜひ試してみてください。
あざした