2023年9月28日

エッジにおける SQLite:Turso の Prisma サポートが早期アクセスで利用可能に

Turso は、エッジホスト型の分散データベースであり、libSQL(SQLite のオープンソースかつオープンコントリビューションのフォーク)をベースにしています。これにより、データをアプリケーションの近くに配置し、クエリのレイテンシを最小限に抑えることができます。

Prisma ORM が Turso の早期アクセスサポートを追加することを発表できることを嬉しく思います。詳細を見ていきましょう!

SQLite on the Edge: Prisma Support for Turso is in Early Access

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 Preview 機能フラグを有効にする必要があります。これにより、Turso のドライバーアダプターを使用してデータベースにクエリを実行できるようになります。

driverAdapters 機能フラグは、データベースへの接続に他のデータベースドライバーを使用できるようにするために取り組んでいるドライバーアダプターイニシアチブの一部です。ドライバーアダプターの例としては、PlanetScaleNeon、libSQL などがあります。詳細については、近日中に公開予定です!まだの方は、このアンケートにご回答いただき、最新情報を受け取るためのメールアドレスをご記入ください。

前提条件

以下のツールがインストールされている必要があります

SQLite を使用した既存のプロジェクトがない場合は、try-prisma を使用してプロジェクトをセットアップできます。作業ディレクトリに移動し、以下のコマンドをコピーしてプロジェクトをセットアップします

プロジェクトに移動し、お好みのコードエディターで開きます

Turso にデータベースを作成する

まず、アプリケーションで使用するデータベースを Turso に作成します。このステップは、Turso のデータベースクライアントを構成するために必要な認証情報を作成するために必要です。

  1. データベースを作成するには、ターミナルで次のコマンドを実行します

    Turso は、お住まいの地域に最も近いリージョンにもデータベースを作成します。

  2. データベースへの接続を許可する認証トークンを作成します

  3. 次に、データベースに接続するための接続文字列の詳細を表示します

    認証トークンと接続文字列をメモしておいてください。これらは次のステップでデータベースに接続するために使用されます。

Prisma を使用して Turso に接続する

Turso の使用を開始するには

  1. Prisma スキーマで driverAdapters Preview 機能フラグを有効にします

  2. 「Turso にデータベースを作成する」ステップの値を使用して、.env ファイルを作成または更新します

  3. 最初のマイグレーションを作成します

  4. マイグレーションを Turso データベースに適用します

  5. 最新バージョンの Prisma Client をインストールします

  6. libSQL データベースクライアントと Prisma Client 用のドライバーアダプターをインストールします

  7. 次のスニペットで Prisma Client インスタンスを更新します

以上です!

これで、Prisma Client を使用して Turso データベースへのクエリを開始できます。

typescript/script の例をクローンした場合、npm run dev を実行してデータを挿入およびクエリし、変更が成功したことを確認できます。

今後のステップ

上記のセットアップでは、単一の リモートデータベースを使用しています。データベースレプリカをセットアップする ことで、さらに一歩進めることができます。Turso は、レプリカを作成すると、読み取りクエリのためにアプリケーションに最も近いレプリカを自動的に選択します。読み取りクエリのルーティング方法を定義するために追加のロジックは必要ありません。書き込みクエリは、プライマリデータベースに転送されます。

ぜひ試してみて、フィードバックをお寄せください!何か不足しているものを見つけたり、バグが発生した場合は、issue を作成 していただくことをお勧めします。


リモート SQLite を超えて:埋め込みレプリカ

Turso を使用すると SQLite をグローバルにレプリケートできますが、アプリケーションからリモートレプリカへの余分なネットワークホップをなくすことができたらどうでしょうか? もし… データベースをアプリケーション内に移動できたらどうでしょうか?

Turso が新しく 発表した埋め込みレプリカ を使用すると、埋め込み/ローカル SQLite データベースの仕組みと同様に、プライマリリモートデータベースのコピーをアプリケーション内に持つことができます。Prisma の新しい Turso サポートを使用して、アプリケーションでこれを試すことができます。

A meme gif of a person having their mind blown.

埋め込みレプリカはどのように機能しますか?

アプリケーションが最初にデータベースへの接続を確立すると、リモートプライマリデータベースがクエリを実行します

次に、Turso は (1) アプリケーション内に埋め込みレプリカを作成し、(2) プライマリデータベースからレプリカにデータをコピーして、ローカルで利用できるようにします

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

埋め込みレプリカを使用すると、データがローカルで即座に利用できるようになるため、このセットアップによりアプリケーションの高速化が保証されます。

おなじみの読み取りレプリカのセットアップと同様に、書き込み操作はプライマリリモートデータベースに転送され、実行されてからすべての埋め込みレプリカに伝播されます。

  1. 書き込み操作の伝播はデータベースに転送されます。
  2. データベースは、1 からの更新でサーバーに応答します。
  3. 書き込み操作はデータベースレプリカに伝播されます。

埋め込みレプリカがクエリに与える影響

埋め込みレプリカの速度を実証するために、同じプライマリデータベースを使用する 2 つのサンプルアプリを作成しました。1 つのバリアントは埋め込みレプリカを使用します。

このサンプルテストでは、次のクエリが使用されます

以下は、アプリケーション起動時の同じクエリのタイミングのスクリーンショットです

埋め込みレプリカなし

時間:154.390 ミリ秒

埋め込みレプリカあり

時間:7.883 ミリ秒

クエリの応答時間は、154.390 ミリ秒から 7.883 ミリ秒へと大幅に低下します。

自分で試してみたい場合は、GitHub で 2 つのサンプルアプリを見つけることができます

埋め込みレプリカは何に使用できますか?

埋め込みレプリカは Turso の比較的新しい機能ですが、使用できるユースケースには次のようなものがあります

  • API の読み取りパフォーマンスの向上:埋め込みレプリカは、Prisma Client を使用した埋め込みデータベースでリモートデータベースサーバーに接続するネットワークコストを削減できます。
  • キャッシュサービスの代替:埋め込みレプリカは、クエリ応答用の Prisma Client 拡張機能 と組み合わせることができ、データが常に最新の状態に保たれるため、アプリケーションを高速化できます。

このデータベースレプリカへの新しいアプローチで、他にどのようなユースケースが生まれるかを見るのは興味深いでしょう。

自分で試してみてください!

Turso と Prisma で何を作成するのか、楽しみにしています。ぜひ試してみて、ご意見をお聞かせください

また、他のサーバーレスデータベースドライバーとエッジ関数デプロイメントのサポートにも取り組んでいます。この簡単なアンケートにご回答いただき、最新情報を受け取るためのメールアドレスをご記入ください。

Twitter または Discord で作成したものをぜひ共有してください。🙌

次回の投稿をお見逃しなく!

Prisma ニュースレターに登録する