メインコンテンツへスキップ

エンジン

技術的な観点から見ると、Prismaクライアントは3つの主要コンポーネントで構成されています

  • JavaScriptクライアントライブラリ
  • TypeScript型定義
  • クエリエンジン

これらのコンポーネントはすべて、prisma generateを実行した後、生成された.prisma/clientフォルダーに配置されます。

このページでは、クエリエンジンに関する関連技術詳細を説明します。

v6.7.0以降、Prisma ORMにはqueryCompilerプレビュー機能が搭載されています。

有効にすると、PrismaクライアントはRustベースのクエリエンジンバイナリなしで生成されます。:

generator client {
provider = "prisma-client-js"
previewFeatures = ["queryCompiler", "driverAdapters"]
}

queryCompilerと合わせてドライバーアダプタープレビュー機能も必要であることに注意してください。

この変更については、当社のブログで詳しく知ることができます。

Prismaエンジン

各モジュールの核には、通常、中核となる機能セットを実装するPrismaエンジンがあります。エンジンはRustで実装されており、上位レベルのインターフェースが使用する低レベルAPIを公開しています。

Prismaエンジンはデータベースへの直接的なインターフェースであり、上位レベルのインターフェースは常にエンジン層を介してデータベースと通信します。

例として、Prismaクライアントはデータベースのデータの読み書きのためにクエリエンジンに接続します。

Prisma engine

カスタムエンジンライブラリまたはバイナリの使用

デフォルトでは、prisma(Prisma CLIパッケージ)をインストールまたは更新すると、すべてのエンジンファイルが自動的にnode_modules/@prisma/enginesフォルダーにダウンロードされます。また、prisma generateを呼び出すと、クエリエンジンも生成されたPrismaクライアントにコピーされます。次の場合に、カスタムライブラリまたはバイナリファイルを使用することができます。

  • エンジンファイルの自動ダウンロードが不可能な場合。
  • テスト目的で、または公式にサポートされていないOSのために、独自のエンジンライブラリまたはバイナリを作成した場合。

以下の環境変数を使用して、バイナリのカスタム場所を指定します。

警告
  • PRISMA_MIGRATION_ENGINE_BINARY変数は5.0.0で非推奨になりました。
  • イントロスペクションエンジンは4.9.0からマイグレーションエンジンによって提供されます。そのため、PRISMA_INTROSPECTION_ENGINE環境変数は使用されません。
  • PRISMA_FMT_BINARY変数は4.2.0以前のバージョンで使用されます。

環境変数の設定

環境変数は、マシン全体または.envファイル内で定義できます。

a) .envファイル

.envファイルに環境変数を追加します。

PRISMA_QUERY_ENGINE_BINARY=custom/my-query-engine-unix

: .envファイルをprismaフォルダーの外部の場所で使用することも可能です。

b) グローバル環境変数

環境変数をグローバルに設定するには、以下のコマンドを実行します(この例ではPRISMA_QUERY_ENGINE_BINARY)。

export PRISMA_QUERY_ENGINE_BINARY=/custom/my-query-engine-unix

環境変数のテスト

すべてのバイナリへのパスを出力するには、以下のコマンドを実行します。

npx prisma -v

出力は、クエリエンジンのパスがPRISMA_QUERY_ENGINE_BINARY環境変数から来ていることを示しています。

Current platform     : darwin
Query Engine : query-engine d6ff7119649922b84e413b3b69660e2f49e2ddf3 (at /custom/my-query-engine-unix)
Migration Engine : migration-engine-cli d6ff7119649922b84e413b3b69660e2f49e2ddf3 (at /myproject/node_modules/@prisma/engines/migration-engine-unix)
Introspection Engine : introspection-core d6ff7119649922b84e413b3b69660e2f49e2ddf3 (at /myproject/node_modules/@prisma/engines/introspection-engine-unix)

エンジンのホスティング

PRISMA_ENGINES_MIRROR環境変数を使用すると、プライベートサーバー、AWSバケット、またはその他のクラウドストレージを介してエンジンファイルをホストできます。これは、カスタムビルドのエンジンを必要とするカスタムOSを使用している場合に役立ちます。

PRISMA_ENGINES_MIRROR=https://my-aws-bucket

クエリエンジンファイル

クエリエンジンファイルは、オペレーティングシステムごとに異なります。これはquery-engine-PLATFORMまたはlibquery_engine-PLATFORMと名付けられ、PLATFORMはコンパイルターゲットの名前に対応します。クエリエンジンファイルの拡張子もプラットフォームによって異なります。例えば、クエリエンジンがmacOS IntelなどのDarwinオペレーティングシステムで実行される場合、libquery_engine-darwin.dylib.nodeまたはquery-engine-darwinと呼ばれます。サポートされているすべてのプラットフォームの概要はこちらで確認できます。

クエリエンジンファイルは、prisma generateが呼び出されたときに、生成されたPrismaクライアントのruntimeディレクトリにダウンロードされます。

クエリエンジンはRustで実装されていることに注意してください。ソースコードはprisma-enginesリポジトリにあります。

実行時のクエリエンジン

デフォルトでは、PrismaクライアントはクエリエンジンをNode-APIライブラリとしてロードしますが、代わりに実行可能バイナリとしてコンパイルされたクエリエンジンを使用するようにPrismaを構成することもできます。このバイナリはアプリケーションのサイドカープロセスとして実行されます。Node-APIライブラリのアプローチは、Prismaクライアントとクエリエンジンの間の通信オーバーヘッドを削減するため推奨されます。

Diagram showing the query engine and Node.js at runtime

クエリエンジンは、最初のPrismaクライアントクエリが呼び出されたとき、またはPrismaClientインスタンスで$connect()メソッドが呼び出されたときに開始されます。クエリエンジンが開始されると、コネクションプールを作成し、データベースへの物理接続を管理します。それ以降、Prismaクライアントはデータベースにクエリ(例: findUnique()findManycreateなど)を送信する準備ができます。

$disconnect()が呼び出されると、クエリエンジンは停止し、データベース接続は閉じられます。

以下の図は「典型的な流れ」を示しています

  1. Prismaクライアントで$connect()が呼び出される
  2. クエリエンジンが起動する
  3. クエリエンジンがデータベースへの接続を確立し、コネクションプールを作成する
  4. Prismaクライアントはデータベースにクエリを送信する準備ができた
  5. PrismaクライアントがfindMany()クエリをクエリエンジンに送信する
  6. クエリエンジンがクエリをSQLに変換し、データベースに送信する
  7. クエリエンジンがデータベースからSQL応答を受信する
  8. クエリエンジンが結果をプレーンなJavaScriptオブジェクトとしてPrismaクライアントに返す
  9. Prismaクライアントで$disconnect()が呼び出される
  10. クエリエンジンがデータベース接続を閉じる
  11. クエリエンジンが停止する

Typical flow of the query engine at run time

クエリエンジンの責任

クエリエンジンは、Prismaクライアントを使用するアプリケーションにおいて以下の責任を負います。

  • コネクションプール内の物理データベース接続を管理する
  • PrismaクライアントNode.jsプロセスから受信クエリを受け取る
  • SQLクエリを生成する
  • SQLクエリをデータベースに送信する
  • データベースからの応答を処理し、Prismaクライアントに送り返す

クエリエンジンのデバッグ

クエリエンジンのログには、DEBUG環境変数をengineに設定することでアクセスできます。

export DEBUG="engine"

また、Prismaクライアントでqueryログレベルを設定することで、クエリエンジンによって生成されるSQLクエリをより詳細に可視化できます。

const prisma = new PrismaClient({
log: ['query'],
})

デバッグロギングについて詳しくはこちら。

クエリエンジンの構成

Prismaクライアントのクエリエンジンタイプを定義する

上記で説明したように、デフォルトのクエリエンジンはPrismaクライアントにロードされるNode-APIライブラリですが、独自のプロセスで実行される実行可能バイナリとしての代替実装も存在します。engineTypeプロパティをPrisma Clientのgeneratorに指定することで、クエリエンジンのタイプを構成できます。

generator client {
provider = "prisma-client-js"
engineType = "binary"
}

engineTypeの有効な値はbinarylibraryです。代わりに環境変数PRISMA_CLIENT_ENGINE_TYPEを使用することもできます。

情報
  • Prisma 3.xまでは、デフォルトで利用可能なエンジンタイプはbinaryのみであったため、PrismaクライアントとPrisma CLIで使用されるエンジンタイプを構成する方法はありませんでした。
  • バージョン2.20.0から3.xまでは、libraryエンジンタイプが利用可能で、プレビュー機能フラグ "nApi"を有効にするか、PRISMA_FORCE_NAPI=true環境変数を使用することでデフォルトで利用されていました。

Prisma CLIのクエリエンジンタイプを定義する

Prisma CLIも独自のニーズのために独自のクエリエンジンを使用します。環境変数PRISMA_CLI_QUERY_ENGINE_TYPE=binaryを定義することで、クエリエンジンのバイナリバージョンを使用するように構成できます。

© 2025 prisma.dokyumento.jp. All rights reserved.