apps/docs/content/docs.v6/orm/more/internals/engines.mdx
:::warning[Prisma ORM v7 is Rust binary-free by default]
As of Prisma ORM v7, Prisma ORM runs without Rust engines by default. This means:
This page documents the legacy Rust-based engine architecture. For the modern Rust-free approach (default in v7), see Prisma ORM without Rust engines.
:::
:::info[Default generator in Prisma ORM v7]
The prisma-client generator is now the default in Prisma ORM v7. It generates TypeScript code into a custom directory you specify (via the output field).
Learn more about the prisma-client generator.
:::
From a technical perspective, when using Rust-based engines (legacy approach), Prisma Client consists of three major components:
All of these components are located in the generated output folder after you run prisma generate.
This page covers relevant technical details about the Rust-based query engine architecture, which is now optional and primarily used for:
prisma-client-js generator usersengineType = "library" or engineType = "binary" with the prisma-client generator:::warning
This section describes the legacy Rust-based engine architecture. In Prisma ORM v7, the default architecture uses a TypeScript-based query compiler without Rust engines.
:::
At the core of each module, there typically is a Prisma engine that implements the core set of functionality. Engines are implemented in Rust and expose a low-level API that is used by the higher-level interfaces.
A Prisma engine is the direct interface to the database, any higher-level interfaces always communicate with the database through the engine-layer.
As an example, when using Rust-based engines, Prisma Client connects to the query engine in order to read and write data in a database:
:::warning
This section applies only to Rust-based engines. Prisma ORM v7 defaults to the TypeScript-based query compiler without Rust engine binaries.
:::
When using Rust-based engines, all engine files are automatically downloaded into the node_modules/@prisma/engines folder when you install or update prisma, the Prisma CLI package. The query engine is also copied to the generated Prisma Client when you call prisma generate.
You might want to use a custom library or binary file if:
Use the following environment variables to specify custom locations for your Rust engine binaries:
PRISMA_QUERY_ENGINE_LIBRARY (Query engine, library) — Not supported in Prisma ORM v7PRISMA_QUERY_ENGINE_BINARY (Query engine, binary) — Not supported in Prisma ORM v7PRISMA_SCHEMA_ENGINE_BINARY (Schema engine)PRISMA_MIGRATION_ENGINE_BINARY (Migration engine)PRISMA_INTROSPECTION_ENGINE_BINARY (Introspection engine) — Not supported in Prisma ORM v7:::warning
Prisma ORM v7 changes:
PRISMA_QUERY_ENGINE_LIBRARY and PRISMA_QUERY_ENGINE_BINARY are not supported in Prisma ORM v7.PRISMA_INTROSPECTION_ENGINE_BINARY is not supported in Prisma ORM v7.Earlier deprecations:
PRISMA_MIGRATION_ENGINE_BINARY variable is deprecated in 5.0.0 because the Migration engine was renamed to Schema Engine.PRISMA_INTROSPECTION_ENGINE environment variable will not be used.PRISMA_FMT_BINARY variable is used in versions 4.2.0 or lower.:::
You can define environment variables globally on your machine or in the .env file.
.env fileAdd the environment variable to the .env file.
PRISMA_QUERY_ENGINE_BINARY=custom/my-query-engine-unix
PRISMA_QUERY_ENGINE_BINARY=c:\custom\path\my-query-engine-binary.exe
Note: It is possible to use an
.envfile in a location outside theprismafolder.
Run the following command to set the environment variable globally (in this example, PRISMA_QUERY_ENGINE_BINARY):
export PRISMA_QUERY_ENGINE_BINARY=/custom/my-query-engine-unix
set PRISMA_QUERY_ENGINE_BINARY=c:\custom\my-query-engine-windows.exe
Run the following command to output the paths to all binaries:
npx prisma -v
The output shows that the query engine path comes from the PRISMA_QUERY_ENGINE_BINARY environment variable:
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)
Current platform : windows
Query Engine : query-engine d6ff7119649922b84e413b3b69660e2f49e2ddf3 (at c:\custom\my-query-engine-windows.exe)
Migration Engine : migration-engine-cli d6ff7119649922b84e413b3b69660e2f49e2ddf3 (at c:\myproject\node_modules\@prisma\engines\migration-engine-windows.exe)
Introspection Engine : introspection-core d6ff7119649922b84e413b3b69660e2f49e2ddf3 (at c:\myproject\node_modules\@prisma\engines\introspection-engine-windows.exe)
:::warning
This section applies only to Rust-based engines. Prisma ORM v7 defaults to the TypeScript-based query compiler without Rust engine binaries.
:::
The PRISMA_ENGINES_MIRROR environment variable allows you to host engine files via a private server, AWS bucket or other cloud storage.
This can be useful if you have a custom OS that requires custom-built engines.
PRISMA_ENGINES_MIRROR=https://my-aws-bucket
:::warning
This section applies only to Rust-based engines. Prisma ORM v7 defaults to the TypeScript-based query compiler without Rust engine binaries.
:::
The query engine file is different for each operating system. It is named query-engine-PLATFORM or libquery_engine-PLATFORM where PLATFORM corresponds to the name of a compile target. Query engine file extensions depend on the platform as well. As an example, if the query engine must run on a Darwin operating system such as macOS Intel, it is called libquery_engine-darwin.dylib.node or query-engine-darwin. You can find an overview of all supported platforms here.
The query engine file is downloaded into the runtime directory of the generated Prisma Client when prisma generate is called.
Note that the query engine is implemented in Rust. The source code is located in the prisma-engines repository.
:::warning
This section applies only to Rust-based engines. Prisma ORM v7 defaults to the TypeScript-based query compiler without Rust engine binaries.
:::
When using Rust-based engines, Prisma Client loads the query engine as a Node-API library by default. You can alternatively configure Prisma to use the query engine compiled as an executable binary, which is run as a sidecar process alongside your application. The Node-API library approach is recommended since it reduces the communication overhead between Prisma Client and the query engine.
The query engine is started when the first Prisma Client query is invoked or when the $connect() method is called on your PrismaClient instance. Once the query engine is started, it creates a connection pool and manages the physical connections to the database. From that point onwards, Prisma Client is ready to send queries to the database (e.g. findUnique(), findMany, create, ...).
The query engine is stopped and the database connections are closed when $disconnect() is invoked.
The following diagram depicts a "typical flow":
$connect() is invoked on Prisma ClientfindMany() query to the query engine$disconnect() is invoked on Prisma Client:::warning
This section applies only to Rust-based engines. Prisma ORM v7 defaults to the TypeScript-based query compiler without Rust engine binaries.
:::
The Rust-based query engine has the following responsibilities in an application that uses Prisma Client:
:::warning
This section applies only to Rust-based engines. Prisma ORM v7 defaults to the TypeScript-based query compiler without Rust engine binaries.
:::
You can access the logs of the Rust-based query engine by setting the DEBUG environment variable to engine:
export DEBUG="engine"
You can also get more visibility into the SQL queries that are generated by the query engine by setting the query log level in Prisma Client:
const prisma = new PrismaClient({
log: ["query"],
});
Learn more about Debugging and Logging.
:::warning
The configuration options in this section apply only to Rust-based engines used in Prisma ORM v6.19 and earlier. Prisma ORM v7 uses the TypeScript-based query compiler by default and does not use these Rust engine configurations.
:::
When using Rust-based engines, you can choose between a Node-API library or an executable binary. Configure the query engine type by providing the engineType property to the Prisma Client generator:
generator client {
provider = "prisma-client"
output = "./generated"
engineType = "binary"
}
Valid values for engineType are:
binary - Executable binary that runs as a sidecar process (Rust-based)library - Node-API library loaded into Prisma Client (Rust-based, default for v6 and earlier):::warning
The environment variable PRISMA_CLIENT_ENGINE_TYPE is not supported in Prisma ORM v7 because Prisma Client now defaults to the TypeScript-based query compiler without Rust engine binaries. See Prisma ORM without Rust engines for more information.
:::
:::info[Historical context]
binary, so there was no way to configure the engine type to be used by Prisma Client and Prisma CLI.library engine type was available and used by default by activating the preview feature flag "nApi" or using the PRISMA_FORCE_NAPI=true environment variable.engineType does not need to be set.:::
When using Rust-based engines, Prisma CLI also uses its own query engine. You can configure it to use the binary version of the query engine by defining the environment variable PRISMA_CLI_QUERY_ENGINE_TYPE=binary.
:::warning
The environment variable PRISMA_CLI_QUERY_ENGINE_TYPE is not supported in Prisma ORM v7 because Prisma CLI now defaults to the TypeScript-based query compiler without Rust engine binaries. See Prisma ORM without Rust engines for more information.
:::