Tursoとは何か、そしてSQLiteとどう違うのか?
SQLiteは、自己完結型でファイルベースのオープンソースデータベースであり、その移植性、信頼性、そして低メモリ環境でも高いパフォーマンスで知られています。その速度から、小規模なWebアプリケーションにも最適です。
しかし、SQLiteのスケーリングには課題があります
- 手動バックアップ
- そのままではレプリケーションができない
- サーバーレス環境でのデータ永続化の困難さ
- マルチサーバーセットアップでのホスティングの困難さ
これらの課題の一部は、SQLiteのレプリケーションとデータベースバックアップを提供するLiteFSのようなツールで解決できます。
一方、Tursoは上記の課題を、SQLiteがまだサポートしていない機能を追加したSQLiteのフォークであるlibSQLを作成することで解決しました。libSQLを使用すると、SQLiteを分散およびレプリケートし、HTTP経由で接続し、非同期操作を実行し、SQLiteをプライマリデータベースまたはプライマリデータベースのレプリカとして他のプログラムの一部に組み込むことができます。
Prisma + Turso = 🚀
Prismaは2019年の最初のリリースからSQLiteをサポートしてきましたが、libSQLはSQLiteとは異なります。たとえば、libSQLはデータベースへの接続にHTTPを使用し、ローカルファイルではなくリモートファイルを使用するため、これまでPrismaとTursoは互換性がありませんでした。
本日、Turso向けPrismaサポートが早期アクセスで利用可能になったことを発表できることを嬉しく思います!
PrismaとTursoを始める
プロジェクトでTursoの使用を開始するには、まずdriverAdapters
プレビュー機能フラグを有効にする必要があります。これにより、Tursoのドライバーアダプターを使用してデータベースをクエリできるようになります。
driverAdapters
機能フラグは、他のデータベースドライバーを使用してデータベースに接続できるようにするために取り組んでいるドライバーアダプターイニシアチブの一部です。ドライバーアダプターの例には、PlanetScale、Neon、およびlibSQLなどがあります。詳細は近日中にお知らせします!まだの方は、このアンケートにご記入いただき、最新情報を受け取るためにメールアドレスをお知らせください。
前提条件
以下のツールがインストールされている必要があります
SQLiteを使用する既存のプロジェクトがない場合は、try-prisma
を使用してプロジェクトをセットアップできます。作業ディレクトリに移動し、以下のコマンドをコピーしてプロジェクトをセットアップしてください。
プロジェクトに移動し、お好みのコードエディタで開いてください
Tursoでデータベースを作成する
まず、アプリケーションが使用するデータベースをTurso上に作成します。このステップは、Tursoのデータベースクライアントを設定するために必要な認証情報を作成するために必要です。
-
データベースを作成するには、ターミナルで以下のコマンドを実行します
Tursoは、あなたの所在地に最も近いリージョンにデータベースを作成します。
-
データベースに接続するための認証トークンを作成します
-
次に、データベースに接続するための接続文字列の詳細を表示します
次のステップでデータベースに接続するために使用する認証トークンと接続文字列をメモしておいてください。
Prismaを使用してTursoに接続する
Tursoの使用を開始するには
-
Prismaスキーマで
driverAdapters
プレビュー機能フラグを有効にします -
「Tursoでデータベースを作成する」ステップの値を使用して、環境変数を含む
.env
ファイルを作成または更新します -
初期マイグレーションを作成します
-
Tursoデータベースにマイグレーションを適用します
-
Prisma Clientの最新バージョンをインストールします
-
libSQLデータベースクライアントとPrisma Client用のドライバーアダプターをインストールします
-
以下のスニペットでPrisma Clientインスタンスを更新します
これで完了です!
これでPrisma Clientを使用してTursoデータベースをクエリできるようになります。
typescript/script
の例をクローンした場合は、npm run dev
を実行してデータを挿入・クエリし、変更が成功したことを確認できます。
次のステップ
上記のセットアップは、単一のリモートデータベースを使用しています。さらに、データベースレプリカを設定することもできます。Tursoは、レプリカを作成すると、読み取りクエリに対してアプリケーションに最も近いレプリカを自動的に選択します。読み取りクエリのルーティングをどのように処理するかを定義するための追加ロジックは必要ありません。書き込みクエリはプライマリデータベースに転送されます。
ぜひ試してフィードバックを共有してください!不足している点やバグを発見した場合は、issueを作成することをお勧めします。
リモートSQLiteのその先へ:埋め込みレプリカ
TursoはSQLiteをグローバルにレプリケートできますが、アプリケーションからリモートレプリカへの余分なネットワークホップをなくせたらどうでしょうか?もし、データベースをアプリケーション内部に移動できたらどうでしょう?
Tursoが新たに発表した埋め込みレプリカを使用すると、組み込み/ローカルSQLiteデータベースが機能するのと同様に、プライマリのリモートデータベースのコピーをアプリケーション

埋め込みレプリカはどのように機能しますか?
アプリが最初にデータベースへの接続を確立すると、リモートプライマリデータベースがクエリを実行します

次にTursoは、(1) アプリケーション内部に

埋め込みレプリカは、後続の読み取りクエリを実行します。libSQLクライアントはsync()
メソッドを提供しており、これを呼び出すことで埋め込みレプリカのデータが常に最新の状態に保たれるようにできます。

埋め込みレプリカを使用すると、データがローカルですぐに利用できるようになるため、このセットアップによりアプリの高速化が保証されます。
お馴染みのリードレプリカ設定と同様に、書き込み操作はプライマリのリモートデータベースに転送され、すべての埋め込みレプリカに伝播される前に実行されます。

- 書き込み操作の伝播はデータベースに転送されます。
- データベースは1からの更新内容をサーバーに返します。
- 書き込み操作はデータベースレプリカに伝播されます。
埋め込みレプリカがクエリに与える影響
埋め込みレプリカの速度を示すために、同じプライマリデータベースを使用する2つのサンプルアプリを作成しました。そのうち1つのバリアントは埋め込みレプリカを使用しています。
このサンプルテストでは、以下のクエリが使用されます
以下は、アプリケーション起動時の同じクエリのタイミングのスクリーンショットです
埋め込みレプリカなし
時間: 154.390 ミリ秒

埋め込みレプリカあり
時間: 7.883 ミリ秒

クエリの応答時間は、154.390 ミリ秒から7.883 ミリ秒へと大幅に短縮されます。
ご自身で試してみたい場合は、GitHubで2つのサンプルアプリを見つけることができます
埋め込みレプリカは何に利用できますか?
埋め込みレプリカはTursoの比較的新しい機能ですが、利用可能なユースケースには以下のようなものがあります
- APIの読み取りパフォーマンスの向上: 埋め込みレプリカは、Prisma Clientを使用した埋め込みデータベースで、リモートデータベースサーバーへの接続に伴うネットワークコストを排除できます。
- キャッシュサービスの代替: 埋め込みレプリカは、クエリ応答用のPrisma Client拡張機能と組み合わせることで、データが常に最新に保たれるため、アプリを高速化できます。
データベースレプリカに対するこの新しいアプローチで、皆さんがどのような他のユースケースを考案されるか楽しみです。
ご自身で試してみてください!
TursoとPrismaで何が構築されるか、今から楽しみです。ぜひ試してご意見をお聞かせください。
また、他のサーバーレスデータベースドライバーやエッジ関数のデプロイメントのサポートにも取り組んでいます。この短いアンケートに回答し、最新情報を受け取るためにメールアドレスをお知らせください。
TwitterやDiscordで、皆さんが構築したものをぜひ共有してください。🙌
次の投稿をお見逃しなく!
Prismaニュースレターに登録