Turso
このガイドでは、Prisma ORM と Turso の使用に関する概念、Turso と他のデータベースプロバイダーとの共通点および相違点について説明し、アプリケーションを Turso と統合するための設定プロセスを案内します。
Turso の Prisma ORM サポートは現在、早期アクセス中です。この GitHub ディスカッションでフィードバックをいただけると幸いです。
Turso とは?
Turso は、libSQL(SQLite のオープンソースかつオープン貢献フォーク)をベースにしたエッジホスト型の分散データベースであり、データをアプリケーションにより近づけ、クエリのレイテンシーを最小限に抑えることができます。Turso はリモートサーバーにホストすることも可能です。
Turso のサポートは、Prisma ORM バージョン 5.4.2 以降で早期アクセスとして利用可能です。
他のデータベースプロバイダーとの共通点
libSQL は SQLite と 100% 互換性があります。libSQL は SQLite を拡張し、以下の機能と能力を追加します
- レプリケーションのサポート
- 自動バックアップのサポート
- Linuxカーネルなどの他のプログラムの一部としてTursoを埋め込む機能
- ユーザー定義関数のサポート
- 非同期I/Oのサポート
libSQL と SQLite の違いについて詳しく知るには、libSQL Manifesto を参照してください。
Prisma ORM を Turso で使用する際の多くの側面は、他のリレーショナルデータベースで Prisma ORM を使用する場合とまったく同じです。引き続き行うことができます
- Prisma Schema Language を使用してデータベースをモデル化する
- スキーマで Prisma ORM の既存の
sqlite
データベースコネクタを使用する - アプリケーションで Prisma Client を使用して Turso のデータベースサーバーと通信する
考慮すべき違い
Turso と SQLite の間にはいくつかの考慮すべき違いがあります。Turso と Prisma ORM の使用を決定する際には、以下の点に注意する必要があります
- リモートおよび組み込み SQLite データベース。libSQL は HTTP を使用してリモート SQLite データベースに接続します。libSQL はリモートデータベースレプリカと組み込みレプリカもサポートしています。組み込みレプリカを使用すると、プライマリデータベースをアプリケーション内にレプリケートできます。
- スキーマ変更の作成。libSQL は HTTP を使用してリモートデータベースに接続するため、Prisma Migrate と互換性がありません。ただし、
prisma migrate diff
を使用してスキーママイグレーションを作成し、Turso の CLI を使用してデータベースに変更を適用できます。
Turso データベースへの接続とクエリの方法
次のセクションでは、Turso データベースを作成し、データベースの資格情報を取得してデータベースに接続する方法について説明します。
データベースのプロビジョニングとデータベース資格情報の取得方法
データベースを管理するために Turso CLI がインストールされていることを確認してください。
既存のデータベースがない場合は、次のコマンドを実行してデータベースをプロビジョニングできます
turso db create turso-prisma-db
上記のコマンドは、あなたの現在地にもっとも近いリージョンにデータベースを作成します。
データベースの接続文字列を取得するには、次のコマンドを実行します
turso db show turso-prisma-db
次に、データベースに接続するための認証トークンを作成します
turso db tokens create turso-prisma-db
認証トークンと接続文字列で .env ファイルを更新します
TURSO_AUTH_TOKEN="eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9..."
TURSO_DATABASE_URL="libsql://turso-prisma-db-user.turso.io"
Turso データベースへの接続方法
まず、driverAdapters
プレビュー機能フラグを有効にします
generator client {
provider = "prisma-client-js"
previewFeatures = ["driverAdapters"]
}
datasource db {
provider = "sqlite"
url = "file:./dev.db" // will be ignored
}
Prisma Client を生成する
npx prisma generate
libSQL パッケージ用の Prisma ORM ドライバーアダプターをインストールする
npm install @prisma/adapter-libsql
Prisma Client インスタンスを更新する
import { PrismaClient } from '@prisma/client'
import { PrismaLibSQL } from '@prisma/adapter-libsql'
const adapter = new PrismaLibSQL({
url: `${process.env.TURSO_DATABASE_URL}`,
authToken: `${process.env.TURSO_AUTH_TOKEN}`,
})
const prisma = new PrismaClient({ adapter })
プロジェクトで通常通り、完全な型安全性で Prisma Client を使用できます。
prisma.config.ts でドライバーアダプター経由で Prisma Migrate を使用する (早期アクセス)
v6.6.0 以降、prisma.config.ts
ファイルを使用すると、prisma db push
を使用してデータベーススキーマに変更を加えることができます。
1. LibSQL ドライバーアダプターをインストールする
ターミナルでこのコマンドを実行します
npm install @prisma/adapter-libsql
2. 環境変数を設定する
LibSQL アダプターを設定するには、いくつかのシークレットを .env
ファイルに追加する必要があります
LIBSQL_DATABASE_URL
: Turso データベースインスタンスの接続 URL。LIBSQL_DATABASE_TOKEN
: Turso データベースインスタンスのトークン。
これらを .env
ファイルに追加するか、別のシークレットストアに保存されている場合は直接使用できます
LIBSQL_DATABASE_URL="..."
LIBSQL_DATABASE_TOKEN="..."
3. Prisma 設定ファイルをセットアップする
プロジェクトに prisma.config.ts
ファイルがあることを確認してください。次に、マイグレーションドライバーアダプターを PrismaLibSQL
を使用するように設定します。
import path from 'node:path'
import { defineConfig } from 'prisma/config'
import { PrismaLibSQL } from '@prisma/adapter-libsql'
// import your .env file
import 'dotenv/config'
type Env = {
LIBSQL_DATABASE_URL: string
LIBSQL_DATABASE_TOKEN: string
}
export default defineConfig<Env>({
earlyAccess: true,
schema: path.join('prisma', 'schema.prisma'),
migrate: {
async adapter(env) {
return new PrismaLibSQL({
url: env.LIBSQL_DATABASE_URL,
authToken: env.LIBSQL_DATABASE_TOKEN,
})
}
}
})
4. データベースを移行する
Prisma Migrate は、prisma.config.ts
で提供された設定に基づいて、リモート Turso データベースに対してマイグレーションを実行します。
このワークフローで最初のマイグレーションを作成するには、次のコマンドを実行します
npx prisma db push
組み込み Turso データベースレプリカ
Turso は 組み込みレプリカ をサポートしています。Turso の組み込みレプリカを使用すると、プライマリのリモートデータベースのコピーをアプリケーション内に持つことができます。組み込みレプリカは、ローカルの SQLite データベースと同様に動作します。データベースはアプリケーション内にあるため、データベースクエリは高速になります。
組み込みデータベースレプリカの仕組み
アプリが最初にデータベースへの接続を確立するとき、プライマリデータベースがクエリを実行します。
Turso は (1) アプリケーション内に組み込みレプリカを作成し、(2) プライマリデータベースからレプリカにデータをコピーしてローカルで利用できるようにします。
組み込みレプリカは、後続の読み取りクエリを実行します。libSQL クライアントは sync()
メソッドを提供しており、これを呼び出すことで組み込みレプリカのデータが最新の状態に保たれるようにすることができます。
組み込みレプリカを使用すると、データがローカルですぐに利用でき、アクセスも高速になるため、この設定は応答性の高いアプリケーションを保証します。
使い慣れているかもしれないリードレプリカのセットアップと同様に、書き込み操作はプライマリのリモートデータベースに転送され、すべての組み込みレプリカに伝播される前に実行されます。
- 書き込み操作の伝播はデータベースに転送されます。
- データベースは、1からの更新をサーバーに応答します。
- 書き込み操作はデータベースレプリカに伝播されます。
アプリケーションのデータ要件によって、リモートデータベースと組み込みデータベースレプリカの間でデータをどのくらいの頻度で同期すべきかが決まります。たとえば、ミドルウェア関数(ExpressやFastifyなど)または cron ジョブを使用してデータを同期できます。
リモートデータベースと組み込みレプリカ間でデータを同期する方法
Prisma ORM で組み込みレプリカの使用を開始するには、アプリケーションに libSQL の sync()
メソッドを追加します。以下の例は、Express ミドルウェアを使用してデータを同期する方法を示しています。
import express from 'express'
const app = express()
// ... the rest of your application code
app.use(async (req, res, next) => {
await libsql.sync()
next()
})
app.listen(3000, () => console.log(`Server ready at http://localhost:3000`))
Prisma Client 拡張機能としても実装できます。以下の例は、作成、更新、または削除操作が実行された後の自動同期を示しています。
const prisma = new PrismaClient().$extends({
query: {
$allModels: {
async $allOperations({ operation, model, args, query }) {
const result = await query(args)
// Synchronize the embedded replica after any write operation
if (['create', 'update', 'delete'].includes(operation)) {
await libsql.sync()
}
return result
}
}
}
})