Prisma Client is an auto-generated, type-safe and modern JavaScript/TypeScript ORM for Node.js that's tailored to your data. Supports PostgreSQL, CockroachDB, MySQL, MariaDB, SQL Server, SQLite & MongoDB databases.
Last release 2 days ago
01 Sep 2026
Ships fairly regularly
a new release about every 1 weeks
Nearly every release is documented
notes for 60 of the last 60 stable releases
3 versions withdrawn
withdrawn after publishing
7 years old
10657 releases · first in 2020
One column per quarter.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Today, we are issuing the 5.4.1 patch release.
@prisma/adapter-planetscaleNothing published for this version
Nothing published for this version
🌟 Help us spread the word about Prisma by starring the repo or tweeting about the release. 🌟
We’re excited to announce Preview support for the Neon and PlanetScale serverless database drivers. The PlanetScale and Neon serverless database drivers allow Prisma to connect to your database using protocols besides TCP — HTTP (PlanetScale) or WebSockets (Neon).
To get started with the serverless database drivers, first enable the driverAdapters Preview feature flag in your Prisma schema:
// schema.prisma
generator client {
provider = "prisma-client-js"
previewFeatures = ["driverAdapters"]
}
Next, to set up Prisma Client to use the serverless database drivers:
Install the Prisma adapter for PlanetScale and PlanetScale serverless database driver, and undici:
npm install @prisma/adapter-planetscale @planetscale/database undici
Prisma ORM supports Node 16 and up. In Node 18 and up,
undiciis not needed.
Ensure you update the host value in your connection string to aws.connect.psdb.cloud. You can learn more about this here.
DATABASE_URL='mysql://johndoe:[email protected]/clear_nightsky?sslaccept=strict'
Update your Prisma Client instance to use the PlanetScale database driver:
// Import required dependencies
import { connect } from '@planetscale/database';
import { PrismaPlanetScale } from '@prisma/adapter-planetscale';
import { PrismaClient } from '@prisma/client';
import { fetch as undiciFetch } from 'undici';
// Initialize Prisma Client with the PlanetScale serverless database driver
const connection = connect({ url: connectionString, fetch: undiciFetch });
const adapter = new PrismaPlanetScale(connection);
const prisma = new PrismaClient({ adapter });
PlanetScale Driver in 5.7.0 and later
In Prisma 5.7.0, usage of the PlanetScale driver adapter changed to the following:
// For Prisma 5.7.0 and later
// Import required dependencies
import { Client } from '@planetscale/database';
import { PrismaPlanetScale } from '@prisma/adapter-planetscale';
import { PrismaClient } from '@prisma/client';
// Initialize Prisma Client with the PlanetScale serverless database driver
const client = new Client({ url: process.env.DATABASE_URL });
const adapter = new PrismaPlanetScale(client);
const prisma = new PrismaClient({ adapter });
Install the Prisma adapter for Neon, Neon serverless database driver and undici (WebSockets):
npm install @prisma/adapter-neon @neondatabase/serverless undici
Update your Prisma Client instance to use the Neon serverless database driver:
// Import required dependencies
import { Pool, neonConfig } from '@neondatabase/serverless';
import { PrismaNeon } from '@prisma/adapter-neon';
import { PrismaClient } from '@prisma/client';
import { WebSocket } from 'undici'
neonConfig.webSocketConstructor = WebSocket;
// Initialize Prisma Client with the Neon serverless database driver
const pool = new Pool({ connectionString: process.env.DATABASE_URL });
const adapter = new PrismaNeon(pool);
const prisma = new PrismaClient({ adapter });
Let us know your feedback about the Neon or Planetscale serverless database drivers in the linked GitHub discussions. Create a bug report if you run into any issues.
Turso is an edge-hosted, distributed database that's based on libSQL, an open-source and open-contribution fork of SQLite, enabling you to bring data closer to your application and minimize query latency.
Since support for Turso is in Early Access, there may be some rough edges which we’re still working on it to improve the API and overall support. Additionally, it is behind the driverAdapters Preview feature flag. Enable it to get started using Turso in your project:
// schema.prisma
generator client {
provider = "prisma-client-js"
previewFeatures = ["driverAdapters"]
}
Next, install the Prisma Client adapter for Turso and the libSQL database client
npm install @prisma/adapter-libsql @libsql/client
Update your Prisma Client instance:
// Import required dependencies
import { PrismaClient } from '@prisma/client'
import { PrismaLibSQL } from '@prisma/adapter-libsql'
import { createClient } from '@libsql/client'
// Create a new instance of the libSQL database client
const libsql = createClient({
// @ts-expect-error
url: process.env.TURSO_DATABASE_URL,
authToken: process.env.TURSO_AUTH_TOKEN
})
// Create a Prisma "adapter" for libSQL
const adapter = new PrismaLibSQL(libsql)
// Pass the adapter option to the Prisma Client instance
const prisma = new PrismaClient({ adapter })
You can learn more on how to use Prisma together with Turso in the announcement blog post.
Try it out! Let us know what you think and create a bug report if you run into any issues.
In our continued efforts to make Prisma Client faster, we identified and improved the performance of different types of queries.
We made the following improvements to relation filters:
INNER JOIN used in relation filter queries (Big thank you to @KhooHaoYit for helping out)LEFT JOIN's for to-one relations. Previously, Prisma made use of sub-queries to fetch data.Example Prisma Client query
prisma.comment.findMany({
where: {
post: {
author: {
name: "John"
}
}
}
})
Before 5.4.0
SELECT
"Comment"."id"
FROM
"Comment"
WHERE
("Comment"."id") IN (
SELECT
"t0"."id"
FROM
"Comment" AS "t0"
INNER JOIN "Post" AS "j0" ON ("j0"."id") = ("t0"."postId")
WHERE
(
("j0"."id") IN (
SELECT
"t1"."id"
FROM
"Post" AS "t1"
INNER JOIN "User" AS "j1" ON ("j1"."id") = ("t1"."userId")
WHERE
(
"j1"."name" = $ 1
AND "t1"."id" IS NOT NULL
)
)
AND "t0"."id" IS NOT NULL
)
);
After 5.4.0
SELECT
"Comment"."id"
FROM
"Comment"
LEFT JOIN "Post" AS "j1" ON ("j1"."id") = ("Comment"."postId")
LEFT JOIN "User" AS "j2" ON ("j2"."id") = ("j1"."userId")
WHERE
(
"j2"."name" = $ 1
AND ("j2"."id" IS NOT NULL)
AND ("j1"."id" IS NOT NULL)
);
If you’re interested in more details on the relation query filter improvements, you can take a look at this pull request.
Previously, when an enum value was used in a query, our Postgres driver would make additional queries to resolve the enum types that were used.
In this release, we’re making improvements by casting enums to TEXT to avoid the additional roundtrips when resolving the types.
This change should have the most impact if you’re using pgBouncer or if you’re running Prisma in a serverless environment, where our Postgres driver can’t cache enum types information.
Prisma schema
model User {
id Int @id @default(cuid())
role Role
}
enum Role {
User
Admin
}
Prisma Client query
await prisma.user.findMany({
where: {
role: "Admin"
}
})
Before 5.4.0
-- Internal driver query
SELECT t.typname, t.typtype, t.typelem, r.rngsubtype, t.typbasetype, n.nspname, t.typrelid FROM pg_catalog.pg_type t LEFT OUTER JOIN pg_catalog.pg_range r ON r.rngtypid = t.oid INNER JOIN pg_catalog.pg_namespace n ON t.typnamespace = n.oid WHERE t.oid = $1;
-- Internal driver query
SELECT enumlabel FROM pg_catalog.pg_enum WHERE enumtypid = $1 ORDER BY enumsortorder;
-- Prisma Client query
SELECT id, role FROM "User" WHERE role = $1;
After 5.4.0
-- Prisma Client query
SELECT id, role::text FROM "User" WHERE role = CAST($1::text AS "Role);
We optimized the deleteMany operation by:
SELECT queries used to fetch data that would be used as input for the DELETE operation. In some cases, this also improves index usage.Prisma Client query
await prisma.post.deleteMany({
where: {
id: {
gt: 1,
lt: 10,
}
}
})
Before 5.4.0
BEGIN
SELECT id FROM "Post" WHERE id > 1 AND id < 10;
SELECT id FROM "Post" WHERE id > 1 AND id < 10 AND id IN (<...select ids>);
DELETE FROM "Post" WHERE id IN (<...select ids>) AND id > 1 AND id < 10;
COMMIT
After 5.4.0
DELETE FROM "Post" WHERE id > 1 AND id < 10;
We improved the upsert operation (non-native database upsert) by removing a redundant SELECT query:
Prisma Client query
await prisma.user.upsert({
where: { email: "[email protected]" },
create: { email: "[email protected]", firstName: "John" },
update: { firstName: "Johnny" },
})
Before 5.4.0
SELECT `User`.`id` FROM `User` WHERE `User`.`email` = ?;
SELECT `User`.`id` FROM `User` WHERE `User`.`email` = ?;
UPDATE `prisma`.`User` SET `firstName` = ? WHERE `prisma`.`User`.`id` IN (?) AND `prisma`.`User`.`email` = ?;
SELECT `User`.`id` FROM `User` WHERE `User`.`id` = ?;
After 5.4.0
SELECT `User`.`id` FROM `User` WHERE `User`.`email` = ?;
UPDATE `prisma`.`User` SET `firstName` = ? WHERE `prisma`.`User`.`id` IN (?) AND `prisma`.`User`.`email` = ?;
SELECT `User`.`id` FROM `User` WHERE `User`.`id` = ?;
SELECT may be generated by upsert()deleteMany optimisationUPDATE, slowing down transaction.deleteMany seems to send 2 identical read queries first before triggering the actual deleteRustPanic: RuntimeError: panicked at 'internal error: entered unreachable code', query-engine/prisma-models/src/field/scalar.rs:93:50metrics propertiesjest-mock-extended or vitest-mock-extended expects never input @@schema is defined in a block without the schemas attributeHuge thanks to @onichandame, @fqazi, @KhooHaoYit, @alencardc, @Oreilles, @christianledgard, @skyzh, @alula, @michaelpoellath, @RobertCraigie, @icanipa, @jiashengguo, @stephenwade, @darthmaim, @ludralph, @Gerschtli, @andyjy for helping!
If you're interested in joining our growing team to help empower developers to build data-intensive applications, Prisma is the place for you.
We're currently hiring for the following roles:
Feel free to read the job descriptions and apply using the links provided.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version