Prisma Client API reference

The Prisma Client API reference documentation is based on the following schema:

model User {
id Int @id @default(autoincrement())
name String?
email String @unique
profileViews Int @default(0)
role Role @default(USER)
coinflips Boolean[]
posts Post[]
city String
country String
profile ExtendedProfile?
pets Json
}
model ExtendedProfile {
id Int @id @default(autoincrement())
userId Int? @unique
bio String?
User User? @relation(fields: [userId], references: [id])
}
model Post {
id Int @id @default(autoincrement())
title String
published Boolean @default(true)
author User @relation(fields: [authorId], references: [id])
authorId Int
comments Json
views Int @default(0)
likes Int @default(0)
}
enum Role {
USER
ADMIN
}

All example generated types (such as UserSelect and UserWhereUniqueInput) are based on the User model.

PrismaClient

This section describes the PrismaClient constructor and its parameters.

Remarks

  • Parameters are validated at runtime.

datasources

Programmatically overrides properties of the datasource block in the schema.prisma file - for example, as part of an integration test. See also: Data sources

From version 5.2.0 and upwards, you can also use the datasourceUrl property to programmatically override the database connection string.

Properties

Example propertyExample valueDescription
db{ url: 'file:./dev_qa.db' }The database connection URL.

Remarks

  • You must re-generate Prisma Client each time you add or rename a data source. Datasource names are included in the generated client.
  • If you named your datasource block something else in the schema, replace db with the name of your datasource block.

Examples

Programmatically override a datasource url
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient({
datasources: {
db: {
url: 'file:./dev_qa.db',
},
},
})

Based on the following datasource block:

datasource db {
provider = "sqlite"
url = env("DATABASE_URL")
}

datasourceUrl

Programmatically overrides the datasource block in the schema.prisma file.

Property

OptionExample valueDescription
Database connection string'file:./dev_qa.db'The database connection URL.

Examples

import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient({
datasourceUrl: 'postgresql://johndoe:randompassword@localhost:5432/mydb',
})

log

Determines the type and level of logging. See also: Logging

Options

OptionExampleDescription
Array of log levels[ "info", "query" ]
Array of log definitions[ { level: "info", emit: "event" }, { level: "warn", emit: "stdout" }]
Log levels
NameExample
queryLogs all queries run by Prisma.

For relational databases this logs all SQL queries. Example:
prisma:query SELECT "public"."User"."id", "public"."User"."email" FROM "public"."User" WHERE ("public"."User"."id") IN (SELECT "t0"."id" FROM "public"."User" AS "t0" INNER JOIN "public"."Post" AS "j0" ON ("j0"."authorId") = ("t0"."id") WHERE ("j0"."views" > $1 AND "t0"."id" IS NOT NULL)) OFFSET $2
For MongoDB this logs queries using the format. Example:
prisma:query db.User.deleteMany({ _id: ( $in: [ “6221ce49f756b0721fc00542”, ], }, })
infoExample:
prisma:info Started http server on http://127.0.0.1:58471
warnWarnings.
errorErrors.
Emit formats
NameDescription
stdoutSee:
eventRaises an event that you can subscribe to.
Event types

The query event type:

index.d.ts
1export type QueryEvent = {
2 timestamp: Date
3 query: string // Query sent to the database
4 params: string // Query parameters
5 duration: number // Time elapsed (in milliseconds) between client issuing query and database responding - not only time taken to run query
6 target: string
7}

Note that for MongoDB, the params and duration fields will be undefined.

All other log level event types:

index.d.ts
1export type LogEvent = {
2 timestamp: Date
3 message: string
4 target: string
5}

Examples

Log query and info to stdout
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient({ log: ['query', 'info'] })
async function main() {
const countUsers = await prisma.user.count({})
}
main()
.then(async () => {
await prisma.$disconnect()
})
.catch(async (e) => {
console.error(e)
await prisma.$disconnect()
process.exit(1)
})
Show CLI results
Log a query event to console
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient({
log: [{ level: 'query', emit: 'event' }],
})
prisma.$on('query', (e) => {
console.log(e)
})
async function main() {
const countUsers = await prisma.user.count({})
}
main()
.then(async () => {
await prisma.$disconnect()
})
.catch(async (e) => {
console.error(e)
await prisma.$disconnect()
process.exit(1)
})
Show CLI results
Log info, warn, and error events to console
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient({
log: [
{ level: 'warn', emit: 'event' },
{ level: 'info', emit: 'event' },
{ level: 'error', emit: 'event' },
],
})
prisma.$on('warn', (e) => {
console.log(e)
})
prisma.$on('info', (e) => {
console.log(e)
})
prisma.$on('error', (e) => {
console.log(e)
})
async function main() {
const countUsers = await prisma.user.count({})
}
main()
.then(async () => {
await prisma.$disconnect()
})
.catch(async (e) => {
console.error(e)
await prisma.$disconnect()
process.exit(1)
})
Show CLI results

errorFormat

Determines the level and formatting of errors returned by Prisma Client.

Error formats

NameDescription
undefinedIf it's not defined, the default is colorless.
prettyEnables pretty error formatting.
colorless (default)Enables colorless error formatting.
minimalEnables minimal error formatting.

Examples

No error formatting
const prisma = new PrismaClient({
// Defaults to colorless
})
pretty error formatting
const prisma = new PrismaClient({
errorFormat: 'pretty',
})
colorless error formatting
const prisma = new PrismaClient({
errorFormat: 'colorless',
})
minimal error formatting
const prisma = new PrismaClient({
errorFormat: 'minimal',
})

adapter

Defines an instance of a driver adapter. See also Database drivers .

This is available from version 5.4.0 and newer behind the driverAdapters feature flag.

Example

The example below uses the Neon driver adapter

import { Pool, neonConfig } from '@neondatabase/serverless'
import { PrismaNeon } from '@prisma/adapter-neon'
import { PrismaClient } from '@prisma/client'
import dotenv from 'dotenv'
import ws from 'ws'
dotenv.config()
neonConfig.webSocketConstructor = ws
const connectionString = `${process.env.DATABASE_URL}`
const pool = new Pool({ connectionString })
const adapter = new PrismaNeon(pool)
const prisma = new PrismaClient({ adapter })

rejectOnNotFound

Note: rejectOnNotFound was removed in v5.0.0.
Deprecated: rejectOnNotFound is deprecated in v4.0.0. From v4.0.0, use the queries findUniqueOrThrow or findFirstOrThrow.

Use the rejectOnNotFound parameter to configure findUnique and/or findFirst to throw an error if the record was not found. By default, both operations return null if the record is not found.

Remarks

Options

OptionDescription
RejectOnNotFoundEnable globally (true / false) or throw a custom error.
RejectPerOperationEnable per operation (true / false) or throw a custom error per operation, per model.

Examples

Enable globally for findUnique and findFirst
const prisma = new PrismaClient({
rejectOnNotFound: true,
})
Enable globally for a specific operation
const prisma = new PrismaClient({
rejectOnNotFound: {
findUnique: true,
},
})
Throw a custom error per model and operation if record is not found
const prisma = new PrismaClient({
rejectOnNotFound: {
findFirst: {
User: (err) => new Error('User error'),
Post: (err) => new Error('Post error!'),
},
findUnique: {
User: (err) => new Error('User error'),
Post: (err) => new Error('Post error!'),
},
},
})

transactionOptions

Note: transactionOptions was introduced in v5.10.0.

Allows to set transaction options globally on the constructor level.

Remarks

  • The transaction levels can be overriden on a per-transaction level.

Options

OptionDescription
maxWaitThe maximum amount of time Prisma Client will wait to acquire a transaction from the database. The default value is 2 seconds.
timeoutThe maximum amount of time the interactive transaction can run before being canceled and rolled back. The default value is 5 seconds.
isolationLevelSets the transaction isolation level. By default this is set to the value currently configured in your database. The available can vary depending on the database you use.

Example

const prisma = new PrismaClient({
transactionOptions: {
isolationLevel: Prisma.TransactionIsolationLevel.Serializable,
maxWait: 5000, // default: 2000
timeout: 10000, // default: 5000
},
})

Model queries

Use model queries to perform CRUD operations on your models. See also: CRUD

findUnique()

findUnique query lets you retrieve a single database record:

  • By ID
  • By a unique attribute

findUnique replaced findOne in version .

Remarks

  • Prisma Client's dataloader automatically batches findUnique queries with the same select and where parameters.
  • If you want the query to throw an error if the record is not found, then consider using findUniqueOrThrow instead.
  • You cannot use filter conditions (e.g. equals, contains, not) to filter fields of the JSON data type. Using filter conditions will likely result in a null response for that field.

Options

NameExample type (User)RequiredDescription
whereUserWhereUniqueInputYesWraps all unique fields of a model so that individual records can be selected.
From version 4.5.0, this type wraps all fields of a model. Learn more
selectXOR<UserSelect, null>NoSpecifies which properties to include on the returned object.
includeXOR<UserInclude, null>NoSpecifies which relations should be eagerly loaded on the returned object.
relationLoadStrategy'join' or 'query'NoDefault: join. Specifies the load strategy for a relation query. Only available in combination with include (or select on a relation field). In Preview since 5.9.0.
rejectOnNotFound (deprecated)RejectOnNotFoundNoIf true, throw a NotFoundError: No User found error. You can also configure rejectOnNotFound globally.
Note: rejectOnNotFoundis deprecated in v4.0.0. From v4.0.0, use findUniqueOrThrow instead.

Return type

Return typeExampleDescription
JavaScript object (typed)User
JavaScript object (plain){ title: "Hello world" }Use select and include to determine which fields to return.
nullnullRecord not found
ErrorIf rejectOnNotFound is true, findUnique throws an error (NotFoundError by default, customizable globally) instead of returning null.

Examples

Get the User record with an id of 42
const result = await prisma.user.findUnique({
where: {
id: 42,
},
})
Get the User record with an email of alice@prisma.io
const result = await prisma.user.findUnique({
where: {
email: 'alice@prisma.io',
},
})
Get the User record with firstName of Alice and lastName of Smith (@@unique)
model User {
firstName String
lastName String
@@unique(fields: [firstName, lastName], name: "fullname")
}
const result = await prisma.user.findUnique({
where: {
fullname: {
// name property of @@unique attribute - default is firstname_lastname
firstName: 'Alice',
lastName: 'Smith',
},
},
})
Get the User record with firstName of Alice and lastName of Smith (@@id)
model User {
firstName String
lastName String
@@id([firstName, lastName])
}
const result = await prisma.user.findUnique({
where: {
firstName_lastName: {
firstName: 'Alice',
lastName: 'Smith',
},
},
})

findUniqueOrThrow()

We introduced findUniqueOrThrow in v4.0.0. It replaces the rejectOnNotFound option. rejectOnNotFound is deprecated in v4.0.0.

findUniqueOrThrow retrieves a single data record in the same way as findUnique. However, if the query does not find a record, it returns NotFoundError: No User found error.

findUniqueOrThrow differs from findUnique as follows:

  • Its return type is non-nullable. For example, post.findUnique() can return post or null, but post.findUniqueOrThrow() always returns post.

  • It is not compatible with sequential operations in the $transaction API. If the query returns NotFoundError, then the API will not roll back any operations in the array of calls. As a workaround, you can use interactive transactions with the $transaction API, as follows:

    $transaction(async (prisma) => {
    await prisma.model.create({ data: { ... });
    await prisma.model.findUniqueOrThrow();
    })

findFirst()

findFirst returns the first record in a list that matches your criteria.

Remarks

  • If you want the query to throw an error if the record is not found, then consider using findFirstOrThrow instead.

Options

NameExample type (User)RequiredDescription
selectXOR<UserSelect, null>NoSpecifies which properties to include on the returned object.
includeXOR<UserInclude, null>NoSpecifies which relations should be eagerly loaded on the returned object.
relationLoadStrategy'join' or 'query'NoDefault: join. Specifies the load strategy for a relation query. Only available in combination with include (or select on a relation field). In Preview since 5.9.0.
whereUserWhereInputNoWraps all model fields in a type so that the list can be filtered by any property.
orderByXOR<Enumerable<User
OrderByInput>,UserOrderByInput>
NoLets you order the returned list by any property.
cursorUserWhereUniqueInputNoSpecifies the position for the list (the value typically specifies an id or another unique value).
takenumberNoSpecifies how many objects should be returned in the list. When used with findFirst, take is implicitly 1 or -1. findFirst is only affected by whether the value is positive or negative - any negative value reverses the list.
skipnumberNoSpecifies how many of the returned objects in the list should be skipped.
distinctEnumerable<UserDistinct
FieldEnum>
NoLets you filter out duplicate rows by a specific field - for example, return only distinct Post titles.
rejectOnNotFound (deprecated)RejectOnNotFoundNoIf true, throw a NotFoundError: No User found error. You can also configure rejectOnNotFound globally.
Note: rejectOnNotFoundis deprecated in v4.0.0. From v4.0.0, use findFirstOrThrow instead.

Return type

Return typeExampleDescription
JavaScript object (typed)UserSpecifies which properties to include on the returned object.
JavaScript object (plain){ title: "Hello world" }Use select and include to determine which fields to return.
nullnullRecord not found
ErrorIf rejectOnNotFound is true, findUnique throws an error (NotFoundError by default, customizable globally) instead of returning null.

Remarks

  • findFirst calls findMany behind the scenes and accepts the same query options.
  • Passing in a negative take value when you use a findFirst query reverses the order of the list.

Examples

See Filter conditions and operators for examples of how to filter results.

Get the first User record where the name is Alice
const user = await prisma.user.findFirst({
where: { name: 'Alice' },
})
Get the first Post record where the title starts with A test, reverse the list with take
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient({})
async function main() {
const a = await prisma.post.create({
data: {
title: 'A test 1',
},
})
const b = await prisma.post.create({
data: {
title: 'A test 2',
},
})
const c = await prisma.post.findFirst({
where: {
title: {
startsWith: 'A test',
},
},
orderBy: {
title: 'asc',
},
take: -1, // Reverse the list
})
}
main()

findFirstOrThrow()

We introduced findFirstOrThrow in v4.0.0. It replaces the rejectOnNotFound option. rejectOnNotFound is deprecated in v4.0.0.

findFirstOrThrow retrieves the first record in a list in the same way as findFirst. However, if the query does not find a record, it returns NotFoundError: No User found error.

findFirstOrThrow differs from findFirst as follows:

  • Its return type is non-nullable. For example, post.findFirst() can return post or null, but post.findFirstOrThrow always returns post.

  • It is not compatible with sequential operations in the $transaction API. If the query returns NotFoundError, then the API will not roll back any operations in the array of calls. As a workaround, you can use interactive transactions with the $transaction API, as follows:

    prisma.$transaction(async (tx) => {
    await tx.model.create({ data: { ... });
    await tx.model.findFirstOrThrow();
    })

findMany()

findMany returns a list of records.

Options

NameTypeRequiredDescription
selectXOR<PostSelect, null>NoSpecifies which properties to include on the returned object.
includeXOR<PostInclude, null>NoSpecifies which relations should be eagerly loaded on the returned object.
relationLoadStrategy'join' or 'query'NoDefault: join. Specifies the load strategy for a relation query. Only available in combination with include (or select on a relation field). In Preview since 5.9.0.
whereUserWhereInputNoWraps all model fields in a type so that the list can be filtered by any property.
orderByXOR<Enumerable<PostOrder
ByInput>, PostOrderByInput>
NoLets you order the returned list by any property.
cursorUserWhereUniqueInputNoSpecifies the position for the list (the value typically specifies an id or another unique value).
takenumberNoSpecifies how many objects should be returned in the list (as seen from the beginning (positive value) or end (negative value) either of the list or from the cursor position if mentioned)
skipnumberNoSpecifies how many of the returned objects in the list should be skipped.
distinctEnumerable<UserDistinctFieldEnum>NoLets you filter out duplicate rows by a specific field - for example, return only distinct Post titles.

Return type

Return typeExampleDescription
JavaScript array object (typed)User[]
JavaScript array object (plain)[{ title: "Hello world" }]Use select and include to determine which fields to return.
Empty array[]No matching records found.

Examples

See Filter conditions and operators for examples of how to filter results.

Get all User records where the name is Alice
const user = await prisma.user.findMany({
where: { name: 'Alice' },
})

create()

create creates a new database record.

Options

NameTypeRequiredDescription
dataXOR<UserCreateInput,
UserUncheckedCreateInput>
YesWraps all the model fields in a type so that they can be provided when creating new records. It also includes relation fields which lets you perform (transactional) nested inserts. Fields that are marked as optional or have default values in the datamodel are optional.
selectXOR<UserSelect, null>NoSpecifies which properties to include on the returned object.
includeXOR<UserInclude, null>NoSpecifies which relations should be eagerly loaded on the returned object.
relationLoadStrategy'join' or 'query'NoDefault: join. Specifies the load strategy for a relation query. Only available in combination with include (or select on a relation field). In Preview since 5.9.0.

Return type

Return typeExampleDescription
JavaScript object (typed)User
JavaScript object (plain){ name: "Alice Wonderland" }Use select and include to determine which fields to return.

Remarks

  • You can also perform a nested create - for example, add a User and two Post records at the same time.

Examples

Create a single new record with the only required field email
const user = await prisma.user.create({
data: { email: 'alice@prisma.io' },
})
Create multiple new records

In most cases, you can carry out batch inserts with the createMany query. However, there are scenarios where create is the best option to insert multiple records.

The following example results in two INSERT statements:

import { Prisma, PrismaClient } from '@prisma/client'
const prisma = new PrismaClient({ log: ['query'] })
async function main() {
let users: Prisma.UserCreateInput[] = [
{
email: 'ariana@prisma.io',
name: 'Ari',
profileViews: 20,
coinflips: [true, false, false],
role: 'ADMIN',
},
{
email: 'elsa@prisma.io',
name: 'Elsa',
profileViews: 20,
coinflips: [true, false, false],
role: 'ADMIN',
},
]
await Promise.all(
users.map(async (user) => {
await prisma.user.create({
data: user,
})
})
)
}
main()
.then(async () => {
await prisma.$disconnect()
})
.catch(async (e) => {
console.error(e)
await prisma.$disconnect()
process.exit(1)
})
Hide CLI results
prisma:query BEGIN
prisma:query INSERT INTO "public"."User" ("name","email","profileViews","role","coinflips") VALUES ($1,$2,$3,$4,$5) RETURNING "public"."User"."id"
prisma:query SELECT "public"."User"."id", "public"."User"."name", "public"."User"."email", "public"."User"."profileViews", "public"."User"."role", "public"."User"."coinflips" FROM "public"."User" WHERE "public"."User"."id" = $1 LIMIT $2 OFFSET $3
prisma:query INSERT INTO "public"."User" ("name","email","profileViews","role","coinflips") VALUES ($1,$2,$3,$4,$5) RETURNING "public"."User"."id"
prisma:query COMMIT
prisma:query SELECT "public"."User"."id", "public"."User"."name", "public"."User"."email", "public"."User"."profileViews", "public"."User"."role", "public"."User"."coinflips" FROM "public"."User" WHERE "public"."User"."id" = $1 LIMIT $2 OFFSET $3
prisma:query COMMIT

update()

update updates an existing database record.

Options

NameTypeRequiredDescription
dataXOR<UserUpdateInput
UserUncheckedUpdateInput>
YesWraps all the fields of the model so that they can be provided when updating an existing record. Fields that are marked as optional or have default values in the datamodel are optional.
whereUserWhereUniqueInputYesWraps all unique fields of a model so that individual records can be selected.
From version 4.5.0, this type wraps all fields of a model. Learn more
selectXOR<UserSelect, null>NoSpecifies which properties to include on the returned object.
includeXOR<UserInclude, null>NoSpecifies which relations should be eagerly loaded on the returned object.
relationLoadStrategy'join' or 'query'NoDefault: join. Specifies the load strategy for a relation query. Only available in combination with include (or select on a relation field). In Preview since 5.9.0.

Return type

Return typeExampleDescription
JavaScript object (typed)User
JavaScript object (plain){ name: "Alice Wonderland" }Use select and include to determine which fields to return.
RecordNotFound exceptionException is thrown if record does not exist.

Remarks

  • To perform arithmetic operations on update (add, subtract, multiply, divide), use atomic updates to prevent race conditions.
  • You can also perform a nested update - for example, update a user and that user's posts at the same time.

Examples

Update the email of the User record with id of 1 to alice@prisma.io
const user = await prisma.user.update({
where: { id: 1 },
data: { email: 'alice@prisma.io' },
})

upsert()

This section covers the usage of the upsert() operation. To learn about using nested upsert queries within update(), reference the linked documentation.

upsert does the following:

  • If an existing database record satisfies the where condition, it updates that record
  • If no database record satisfies the where condition, it creates a new database record

Options

NameTypeRequiredDescription
createXOR<UserCreateInput,
UserUncheckedCreateInput>
YesWraps all the fields of the model so that they can be provided when creating new records. It also includes relation fields which lets you perform (transactional) nested inserts. Fields that are marked as optional or have default values in the datamodel are optional.
updateXOR<UserUpdateInput,
UserUncheckedUpdateInput>
YesWraps all the fields of the model so that they can be provided when updating an existing record. Fields that are marked as optional or have default values in the datamodel are optional.
whereUserWhereUniqueInputYesWraps all unique fields of a model so that individual records can be selected.
From version 4.5.0, this type wraps all fields of a model. Learn more
selectXOR<UserSelect, null>NoSpecifies which properties to include on the returned object.
includeXOR<UserInclude, null>NoSpecifies which relations should be eagerly loaded on the returned object.
relationLoadStrategy'join' or 'query'NoDefault: join. Specifies the load strategy for a relation query. Only available in combination with include (or select on a relation field). In Preview since 5.9.0.

Return type

Return typeExampleDescription
JavaScript object (typed)User
JavaScript object (plain){ name: "Alice Wonderland" }Use select and include to determine which fields to return.

Remarks

  • To perform arithmetic operations on update (add, subtract, multiply, divide), use atomic updates to prevent race conditions.
  • If two or more upsert operations happen at the same time and the record doesn't already exist, then a race condition might happen. As a result, one or more of the upsert operations might throw a unique key constraint error. Your application code can catch this error and retry the operation. Learn more.
  • From version 4.6.0, Prisma ORM hands over upsert queries to the database where possible. Learn more.

Examples

Update (if exists) or create a new User record with an email of alice@prisma.io
const user = await prisma.user.upsert({
where: { id: 1 },
update: { email: 'alice@prisma.io' },
create: { email: 'alice@prisma.io' },
})

Unique key constraint errors on upserts

Problem

If multiple upsert operations happen at the same time and the record doesn't already exist, then one or more of the operations might return a unique key constraint error.

Cause

When Prisma Client does an upsert, it first checks whether that record already exists in the database. To make this check, Prisma Client performs a read operation with the where clause from the upsert operation. This has two possible outcomes, as follows:

  • If the record does not exist, then Prisma Client creates that record.
  • If the record exists, then Prisma Client updates it.

When your application tries to perform two or more concurrent upsert operations, then a race condition might happen where two or more operations do not find the record and therefore try to create that record. In this situation, one of the operations successfully creates the new record but the other operations fail and return a unique key constraint error.

Solution

Handle the P2002 error in your application code. When it occurs, retry the upsert operation to update the row.

Database upserts

Where possible, Prisma Client hands over an upsert query to the database. This is called a database upsert.

Database upserts have the following advantages:

Prisma Client uses a database upsert automatically when specific criteria are met. When these criteria are not met, Prisma Client handles the upsert.

To use a database upsert, Prisma Client sends the SQL construction to the database.

Database upsert prerequisites

Prisma Client can use database upserts if your stack meets the following criteria:

  • You use Prisma ORM version 4.6.0 or later
  • Your application uses a CockroachDB, PostgreSQL, or SQLite data source
Database upsert query criteria

Prisma Client uses a database upsert for an upsert query when the query meets the following criteria:

  • There are no nested queries in the upsert's create and update options
  • The query does not include a selection that uses a nested read
  • The query modifies only one model
  • There is only one unique field in the upsert's where option
  • The unique field in the where option and the unique field in the create option have the same value

If your query does not meet these criteria, then Prisma Client handles the upsert itself.

Database upsert examples

The following examples use this schema:

model User {
id Int @id
profileViews Int
userName String @unique
email String
@@unique([id, profileViews])
}

The following upsert query meets all of the criteria, so Prisma Client uses a database upsert.

prisma.user.upsert({
where: {
userName: 'Alice',
},
create: {
id: 1,
profileViews: 1,
userName: 'Alice',
email: 'alice@prisma.io',
},
update: {
email: 'updated@example.com',
},
})

In this situation, Prisma uses the following SQL query:

INSERT INTO "public"."User" ("id","profileViews","userName","email") VALUES ($1,$2,$3,$4)
ON CONFLICT ("userName") DO UPDATE
SET "email" = $5 WHERE ("public"."User"."userName" = $6 AND 1=1) RETURNING "public"."User"."id", "public"."User"."profileViews", "public"."User"."userName", "public"."User"."email"

The following query has multiple unique values in the where clause, so Prisma Client does not use a database upsert:

prisma.User.upsert({
where: {
userName: 'Alice',
profileViews: 1,
id: 1,
},
create: {
id: 1,
profileViews: 1,
userName: 'Alice',
email: 'alice@prisma.io',
},
update: {
email: 'updated@example.com',
},
})

In the following query, the values for userName in the where and create options are different, so Prisma Client does not use a database upsert.

prisma.User.upsert({
where: {
userName: 'Alice',
},
create: {
id: 1,
profileViews: 1,
userName: 'AliceS',
email: 'alice@prisma.io',
},
update: {
email: 'updated@example.com',
},
})

In the following query, the selection on the title field in posts is a nested read, so Prisma Client does not use a database upsert.

prisma.user.upsert({
select: {
email: true,
id: true,
posts: {
select: {
title: true,
},
},
},
where: {
userName: 'Alice',
},
create: {
id: 1,
profileViews: 1,
userName: 'Alice',
email: 'alice@prisma.io',
},
update: {
email: 'updated@example.com',
},
})

delete()

delete deletes an existing database record. You can delete a record:

  • By ID
  • By a unique attribute

To delete records that match a certain criteria, use deleteMany with a filter.

Options

NameTypeRequiredDescription
whereUserWhereUniqueInputYesWraps all unique fields of a model so that individual records can be selected.
From version 4.5.0, this type wraps all fields of a model. Learn more
selectXOR<UserSelect, null>NoSpecifies which properties to include on the returned object.
includeXOR<UserInclude, null>NoSpecifies which relations should be eagerly loaded on the returned object.
relationLoadStrategy'join' or 'query'NoDefault: join. Specifies the load strategy for a relation query. Only available in combination with include (or select on a relation field). In Preview since 5.9.0.

Return type

Return typeExampleDescription
JavaScript object (typed)UserThe User record that was deleted.
JavaScript object (plain){ name: "Alice Wonderland" }Data from the User record that was deleted. Use select and include to determine which fields to return.
RecordNotFound exceptionThrows an exception if record does not exist.

Remarks

  • To delete multiple records based on some criteria (for example, all User records with a prisma.io email address, use deleteMany)

Examples

Delete the User record with an id of 1
const user = await prisma.user.delete({
where: { id: 1 },
})
Delete the User record where email equals else@prisma.io

The following query deletes a specific user record and uses select to return the name and email of the deleted user:

const deleteUser = await prisma.user.delete({
where: {
email: 'elsa@prisma.io',
},
select: {
email: true,
name: true,
},
})
Hide CLI results
{ "email": "elsa@prisma.io", "name": "Elsa" }

createMany()

createMany creates multiple records in a transaction.

Options

NameTypeRequiredDescription
dataEnumerable<UserCreateManyInput>YesWraps all the model fields in a type so that they can be provided when creating new records. Fields that are marked as optional or have default values in the datamodel are optional.
skipDuplicates?booleanNoDo not insert records with unique fields or ID fields that already exist. Only supported by databases that support . This excludes MongoDB and SQLServer

Return type

Return typeExampleDescription
BatchPayload{ count: 3 }A count of the number of records created.

Remarks

  • createMany is not supported by SQLite.
  • The skipDuplicates option is not supported by MongoDB and SQLServer.
  • You cannot create or connect relations - you cannot nest create, createMany, connect, connectOrCreate inside a top-level createMany
  • You can nest a createMany inside an update or create query - for example, add a User and two Post records at the same time.

Examples

Create several new users
const users = await prisma.user.createMany({
data: [
{ name: 'Sonali', email: 'sonali@prisma.io' },
{ name: 'Alex', email: 'alex@prisma.io' },
],
})

updateMany()

updateMany updates a batch of existing database records in bulk and returns the number of updated records.

Options

NameTypeRequiredDescription
dataXOR<UserUpdateManyMutationInput,
UserUncheckedUpdateManyInput>
YesWraps all the fields of the model so that they can be provided when updating an existing record. Fields that are marked as optional or have default values in the datamodel are optional on data.
whereUserWhereInputNoWraps all fields of a model so that the list can be filtered by any property. If you do not filter the list, all records will be updated.

Return type

Return typeExampleDescription
BatchPayload{ count: 4 }The count of updated records.
export type BatchPayload = {
count: number
}

Examples

Update all User records where the name is Alice to ALICE
const updatedUserCount = await prisma.user.updateMany({
where: { name: 'Alice' },
data: { name: 'ALICE' },
})
Update all User records where the email contains prisma.io and at least one related Post has more than 10 likes
const deleteUser = await prisma.user.updateMany({
where: {
email: {
contains: 'prisma.io',
},
posts: {
some: {
likes: {
gt: 10,
},
},
},
},
data: {
role: 'USER',
},
})

deleteMany()

deleteMany deletes multiple records in a transaction.

Options

NameTypeRequiredDescription
whereUserWhereInputNoWraps all fields of a model so that the list can be filtered by any field.

Return type

Return typeExampleDescription
BatchPayload{ count: 4 }The count of deleted records.
export type BatchPayload = {
count: number
}

Examples

Delete all User records
const deletedUserCount = await prisma.user.deleteMany({})
Delete all User records where the name is Alice
const deletedUserCount = await prisma.user.deleteMany({
where: { name: 'Alice' },
})

See Filter conditions and operators for examples of how to filter the records to delete.

count()

Options

NameTypeRequiredDescription
whereUserWhereInputNoWraps all model fields in a type so that the list can be filtered by any property.
orderByXOR<Enumerable<PostOrder
ByInput>, PostOrderByInput>
NoLets you order the returned list by any property.
cursorUserWhereUniqueInputNoSpecifies the position for the list (the value typically specifies an id or another unique value).
takenumberNoSpecifies how many objects should be returned in the list (as seen from the beginning (positive value) or end (negative value) either of the list or from the cursor position if mentioned)
skipnumberNoSpecifies how many of the returned objects in the list should be skipped.

Return type

Return typeExampleDescription
number29The count of records.
UserCountAggregateOutputType{ _all: 27, name: 10 }Returned if select is used.

Examples

Count all User records
const result = await prisma.user.count()
Count all User records with at least one published Post
const result = await prisma.user.count({
where: {
post: {
some: {
published: true,
},
},
},
})
Use select to perform three separate counts

The following query returns:

  • A count of all records (_all)
  • A count of all records with non-null name fields
  • A count of all records with non-null city fields
const c = await prisma.user.count({
select: {
_all: true,
city: true,
name: true,
},
})

aggregate()

See also: Aggregation, grouping, and summarizing

Options

NameTypeRequiredDescription
whereUserWhereInputNoWraps all model fields in a type so that the list can be filtered by any property.
orderByXOR<Enumerable<UserOrderByInput>,
UserOrderByInput>
NoLets you order the returned list by any property.
cursorUserWhereUniqueInputNoSpecifies the position for the list (the value typically specifies an id or another unique value).
takenumberNoSpecifies how many objects should be returned in the list (as seen from the beginning (positive value) or end (negative value) either of the list or from the cursor position if mentioned)
skipnumberNoSpecifies how many of the returned objects in the list should be skipped.
_counttrueNoReturns a count of matching records or non-null fields.
_avgUserAvgAggregateInputTypeNoReturns an average of all values of the specified field.
_sumUserSumAggregateInputTypeNoReturns the sum of all values of the specified field.
_minUserMinAggregateInputTypeNoReturns the smallest available value of the specified field.
_maxUserMaxAggregateInputTypeNoReturns the largest available value of the specified field.

Examples

Return _min, _max, and _count of profileViews of all User records
const minMaxAge = await prisma.user.aggregate({
_count: {
_all: true,
},
_max: {
profileViews: true,
},
_min: {
profileViews: true,
},
})
Show CLI results
Return _sum of all profileViews for all User records
const setValue = await prisma.user.aggregate({
_sum: {
profileViews: true,
},
})
Show CLI results

groupBy()

See also: Aggregation, grouping, and summarizing

Options

NameTypeRequiredDescription
whereUserWhereInputNoWraps all model fields in a type so that the list can be filtered by any property.
orderByXOR<Enumerable<UserOrderByInput>,
UserOrderByInput>
NoLets you order the returned list by any property that is also present in by.
byArray<UserScalarFieldEnum> | stringNoSpecifies the field or combination of fields to group records by.
havingUserScalarWhereWithAggregatesInputNoAllows you to filter groups by an aggregate value - for example, only return groups having an average age less than 50.
takenumberNoSpecifies how many objects should be returned in the list (as seen from the beginning (positive value) or end (negative value) either of the list or from the cursor position if mentioned)
skipnumberNoSpecifies how many of the returned objects in the list should be skipped.
_counttrue | UserCountAggregateInputTypeNoReturns a count of matching records or non-null fields.
_avgUserAvgAggregateInputTypeNoReturns an average of all values of the specified field.
_sumUserSumAggregateInputTypeNoReturns the sum of all values of the specified field.
_minUserMinAggregateInputTypeNoReturns the smallest available value of the specified field.
_maxUserMaxAggregateInputTypeNoReturns the largest available value of the specified field.

Examples

Group by country/city where the average profileViews is greater than 200, and return the _sum of profileViews for each group

The query also returns a count of _all records in each group, and all records with non-null city field values in each group.

const groupUsers = await prisma.user.groupBy({
by: ['country', 'city'],
_count: {
_all: true,
city: true,
},
_sum: {
profileViews: true,
},
orderBy: {
country: 'desc',
},
having: {
profileViews: {
_avg: {
gt: 200,
},
},
},
})
Hide CLI results
;[
{
country: 'Denmark',
city: 'Copenhagen',
_sum: { profileViews: 490 },
_count: {
_all: 70,
city: 8,
},
},
{
country: 'Sweden',
city: 'Stockholm',
_sum: { profileViews: 500 },
_count: {
_all: 50,
city: 3,
},
},
]

Model query options

select

select defines which fields are included in the object that Prisma Client returns. See: Select fields and include relations .

Remarks

Examples

Select the name and profileViews fields of a single User record
const result = await prisma.user.findUnique({
where: { id: 1 },
select: {
name: true,
profileViews: true,
},
})
Show CLI results
Select the email and role fields of a multiple User records
const result = await prisma.user.findMany({
select: {
email: true,
role: true,
},
})
Show CLI results
Select a _count of relations
const usersWithCount = await prisma.user.findMany({
select: {
_count: {
select: { posts: true },
},
},
})
Show CLI results
Select the 'id' and 'title' fields of related Post records
const result = await prisma.user.findMany({
select: {
id: true,
name: true,
posts: {
select: {
id: true,
title: true,
},
},
},
})
Show CLI results
include inside select
const result = await prisma.user.findMany({
select: {
id: true,
name: true,
posts: {
include: {
author: true,
},
},
},
})
Show CLI results

Generated types for select

The following examples demonstrate how to use the validator with select:

  • SelectAndInclude
  • UserSelect
// SelectAndInclude
const selectNameIncludeEmail = Prisma.validator<Prisma.SelectAndInclude>()({
select: {
name: true,
},
include: {
email: true,
},
})
// UserSelect
const selectNameEmailNotPosts = Prisma.validator<Prisma.UserSelect>()({
name: true,
email: true,
posts: false,
})

include

include defines which relations are included in the result that Prisma Client returns. See: Select fields and include relations .

Remarks

Examples

Include the posts and profile relation when loading User records
const users = await prisma.user.findMany({
include: {
posts: true, // Returns all fields for all posts
profile: true, // Returns all Profile fields
},
})
Include the posts relation on the returned objects when creating a new User record with two Post records
const user = await prisma.user.create({
data: {
email: 'alice@prisma.io',
posts: {
create: [
{ title: 'This is my first post' },
{ title: 'Here comes a second post' },
],
},
},
include: { posts: true }, // Returns all fields for all posts
})

Generated types for include

The following examples demonstrate how to use the validator with include:

  • SelectAndInclude
  • UserInclude
// SelectAndInclude
const selectNameIncludeEmail = Prisma.validator<Prisma.SelectAndInclude>()({
select: {
name: true,
},
include: {
email: true,
},
})
// UserInclude
const includePosts = Prisma.validator<Prisma.UserInclude>()({
posts: true,
})
Include a _count of relations
const usersWithCount = await prisma.user.findMany({
include: {
_count: {
select: { posts: true },
},
},
})
Show CLI results

relationLoadStrategy (Preview)

relationLoadStrategy specifies how a relation should be loaded from the database. It has two possible values:

  • join (default): Uses a database-level LATERAL JOIN and fetches all data with a single query to the database.
  • query: Sends multiple queries to the database (one per table) and joins them on the application level.

Note: Once relationLoadStrategy moves from Preview into General Availability, join will universally become the default for all relation queries.

You can learn more about join strategies here.

Because the relationLoadStrategy option is currently in Preview, you need to enable it via the relationJoins preview feature flag in your Prisma schema file:

generator client {
provider = "prisma-client-js"
previewFeatures = ["relationJoins"]
}

After adding this flag, you need to run prisma generate again to re-generate Prisma Client. Also note that this feature is currently only available on PostgreSQL and CockroachDB, support for other DBs is coming soon.

Remarks

  • In most situations, the default join strategy will be more effective. Use query if you want to save resources on your database server or if you profiling shows that the application-level join is more performant.
  • You can only specify the relationLoadStrategy on the top-level in your query. The top-level choice will affect all nested sub-queries.

Examples

Load the posts relation via a database-level JOIN when using include
const users = await prisma.user.findMany({
relationLoadStrategy: 'join',
include: {
posts: true,
},
})
Load the posts relation via a database-level JOIN when using select
const users = await prisma.user.findMany({
relationLoadStrategy: 'join',
select: {
posts: true,
},
})

where

where defines one or more filters, and can be used to filter on record properties (like a user's email address) or related record properties (like a user's top 10 most recent post titles).

Examples

const results = await prisma.user.findMany({
where: {
email: {
endsWith: 'prisma.io',
},
},
})

Generated types for where

The following examples demonstrate how to use the validator with where:

  • UserWhereInput

    // UserWhereInput
    const whereNameIs = Prisma.validator<Prisma.UserWhereInput>()({
    name: 'Rich',
    })
    // It can be combined with conditional operators too
    const whereNameIs = Prisma.validator<Prisma.UserWhereInput>()({
    name: 'Rich',
    AND: [
    {
    email: {
    contains: 'rich@boop.com',
    },
    },
    ],
    })
  • UserWhereUniqueInput This type works by exposing any unique fields on the model. A field assigned @id is considered unique, as is one assigned @unique.

    From version 4.5.0, this type exposes all fields on the model. This means that when you filter for a single record based on a unique field, you can check additional non-unique and unique fields at the same time. Learn more.

// UserWhereUniqueInput
const whereEmailIsUnique = Prisma.validator<Prisma.UserWhereUniqueInput>()({
email: 'rich@boop.com',
})
  • PostScalarWhereInput

    const whereScalarTitleIs = Prisma.validator<Prisma.PostScalarWhereInput>()({
    title: 'boop',
    })
  • PostUpdateWithWhereUniqueWithoutAuthorInput - This type accepts a unique where field (an @id or another assigned @unique) and updates any field on the Post model except the Author. The Author is the scalar field on the Post model.

    const updatePostByIdWithoutAuthor =
    Prisma.validator<Prisma.PostUpdateWithWhereUniqueWithoutAuthorInput>()({
    where: {
    id: 1,
    },
    data: {
    content: 'This is some updated content',
    published: true,
    title: 'This is a new title',
    },
    })
  • PostUpsertWithWhereUniqueWithoutAuthorInput - This type will update the Post records title field where the id matches, if it doesn't exist it will create it instead.

    const updatePostTitleOrCreateIfNotExist =
    Prisma.validator<Prisma.PostUpsertWithWhereUniqueWithoutAuthorInput>()({
    where: {
    id: 1,
    },
    update: {
    title: 'This is a new title',
    },
    create: {
    id: 1,
    title: 'If the title doesnt exist, then create one with this text',
    },
    })
  • PostUpdateManyWithWhereWithoutAuthorInput - This type will update all Post records where published is set to false.

    const publishAllPosts =
    Prisma.validator<Prisma.PostUpdateManyWithWhereWithoutAuthorInput>()({
    where: {
    published: {
    equals: false,
    },
    },
    data: {
    published: true,
    },
    })

orderBy

Sorts a list of records. See also: Sorting

Remarks

Inputs for sort argument

NameDescription
ascSort ascending (A Z)
descSort descending (Z A)

Inputs for nulls argument

Note:

  • This argument is optional.
  • It is for use on optional scalar fields only. If you try to sort by nulls on a required or relation field, Prisma Client throws a P2009 error.
  • It is available in version 4.1.0 and later, as a preview feature. See sort with nulls first or last for details of how to enable the feature.
NameDescription
firstSort with null values first.
lastSort with null values last.

Examples

Sort User by email field

The following example returns all User records sorted by email ascending:

const users = await prisma.user.findMany({
orderBy: {
email: 'asc',
},
})

The following example returns all User records sorted by email descending:

const users = await prisma.user.findMany({
orderBy: {
email: 'desc',
},
})

Sort Post by the related User record's name

The following query orders posts by user name:

const posts = await prisma.post.findMany({
orderBy: {
author: {
name: 'asc',
},
},
})

Sort Post by the related User record's name, with null records first

The following query orders posts by user name, with null records first:

const posts = await prisma.post.findMany({
orderBy: {
author: {
name: { sort: 'asc', nulls: 'first' },
},
},
})

Sort Post by relevance of the title

This feature is available from version 3.5.0 onwards in PostgreSQL and MySQL only. You'll need to use the fullTextSearch preview flag to enable this feature.

The following query orders posts by relevance of the search term 'database' to the title:

const posts = await prisma.post.findMany({
orderBy: {
_relevance: {
fields: ['title'],
search: 'database',
sort: 'asc'
},
})

Sort User by the posts count

The following query orders users by post count:

const getActiveusers = await prisma.user.findMany({
orderBy: {
posts: {
count: 'desc',
},
},
})
Sort User by multiple fields - email and role

The following example sorts users by two fields - first email, then role:

const users = await prisma.user.findMany({
select: {
email: true,
role: true,
},
orderBy: [
{
email: 'desc',
},
{
role: 'desc',
},
],
})
Show CLI results

The order of sorting parameters matters - the following query sorts by role, then email. Not the difference in the results:

const users = await prisma.user.findMany({
select: {
email: true,
role: true,
},
orderBy: [
{
role: 'desc',
},
{
email: 'desc',
},
],
})
Show CLI results
Sort User by email, select name and email

The following example returns all the name and email fields of all User records, sorted by email:

const users3 = await prisma.user.findMany({
orderBy: {
email: 'asc',
},
select: {
name: true,
email: true,
},
})
Show CLI results
Sort User records by email and sort nested Post records by title

The following example:

  • Returns all User records sorted by email
  • For each User record, returns the title field of all nested Post records sorted by title
const usersWithPosts = await prisma.user.findMany({
orderBy: {
email: 'asc',
},
include: {
posts: {
select: {
title: true,
},
orderBy: {
title: 'asc',
},
},
},
})
Show CLI results
Sort one user's nested list of Post records

The following example retrieves a single User record by ID, as well as a list of nested Post records sorted by title:

const userWithPosts = await prisma.user.findUnique({
where: {
id: 1,
},
include: {
posts: {
orderBy: {
title: 'desc',
},
select: {
title: true,
published: true,
},
},
},
})
Show CLI results
Sort by enum

The following sorts all User records by role (an enum):

const sort = await prisma.user.findMany({
orderBy: {
role: 'desc',
},
select: {
email: true,
role: true,
},
})
Show CLI results

Generated types for orderBy

The following examples demonstrate how to use the validator with orderBy:

  • UserOrderByInput
    const orderEmailsByDescending = Prisma.validator<Prisma.UserOrderByInput>()({
    email: 'desc',
    })

distinct

Deduplicate a list of records from findMany or findFirst. See also: Aggregation, grouping, and summarizing

Examples

Select distinct on a single field

The following example returns all distinct city fields, and selects only the city and country fields:

const distinctCities = await prisma.user.findMany({
select: {
city: true,
country: true,
},
distinct: ['city'],
})
Hide CLI results
;[
{ city: 'Paris', country: 'France' },
{ city: 'Lyon', country: 'France' },
]
Select distinct on multiple fields

The following example returns all distinct city and country field combinations, and selects only the city and country fields:

const distinctCitiesAndCountries = await prisma.user.findMany({
select: {
city: true,
country: true,
},
distinct: ['city', 'country'],
})
Hide CLI results
;[
{ city: 'Paris', country: 'France' },
{ city: 'Paris', country: 'Denmark' },
{ city: 'Lyon', country: 'France' },
]

Note that there is now a "Paris, Denmark" in addition to "Paris, France":

Select distinct in combination with a filter

The following example returns all distinct city and country field combinations where the user's email contains "prisma.io", and selects only the city and country fields: