findUniqueПозволяет извлекать единичные записи по идентификатору или уникальному полю.
Сигнатура
findUnique({
where: condition,
select? : fields,
include? : relations,
rejectOnNotFound? : boolean
})
Модификатор?означает, что поле является опциональным.
condition— условие для выборки;fields— поля для выборки;relations— отношения (связанные поля) для выборки;rejectOnNotFound— если имеет значениеtrue, при отсутствии записи выбрасывается исключениеNotFoundError. Если
имеет значениеfalse, при отсутствии записи возвращаетсяnull.Пример
async function getUserById(id) {
try {
const user = await prisma.user.findUnique({
where: {
id
}
})
return user
} catch (e) {
onError(e)
}
}
findFirstВозвращает первую запись, соответствующую заданному критерию.
Сигнатура
findFirst({
where? : condition,
select? : fields,
include? : relations,
rejectOnNotFound? : boolean,
distinct? : field,
orderBy? : order,
cursor? : position,
skip? : number,
take? : number
})
distinct— фильтрация по определенному полю;orderBy— сортировка по определенному полю и в определенном порядке;cursor— позиция начала списка (как правило,idили другое уникальное значение);skip— количество пропускаемых записей;take— количество возвращаемых записей (в данном случае может иметь значение 1 или -1: во втором случае
возвращается
последняя запись).Пример
async function getLastPostByAuthorId(author_id) {
try {
const post = await prisma.post.findFirst({
where: {
author_id
},
orderBy: {
created_at: 'asc'
},
take: -1
})
return post
} catch (e) {
onError(e)
}
}
findManyВозвращает все записи, соответствующие заданному критерию.
Сигнатура
findMany({
where? : condition,
select? : fields,
include? : relations,
rejectOnNotFound? : boolean,
distinct? : field,
orderBy? : order,
cursor? : position,
skip? : number,
take? : number
})
Пример
async function getAllPostsByAuthorId(author_id) {
try {
const posts = await prisma.post.findMany({
where: {
author_id
},
orderBy: {
updated_at: 'desc'
}
})
return posts
} catch (e) {
onError(e)
}
}
createСоздает новую запись.
Сигнатура
create({
data: _data,
select? : fields,
include? : relations
})
_data— данные создаваемой записи.Пример
async function createUserWithProfile(data) {
const {email, password, firstName, lastName, age} = data
try {
const hash = await argon2.hash(password)
const user = await prisma.user.create({
data: {
email,
hash,
profile: {
create: {
first_name: firstName,
last_name: lastName,
age
}
}
},
select: {
email: true
},
include: {
profile: true
}
})
return user
} catch (e) {
onError(e)
}
}
updateОбновляет существующую запись.
Сигнатура
update({
data: _data,
where: condition,
select? : fields,
include? : relations
})
Пример
async function updateUserById(id, changes) {
const {email, age} = changes
try {
const user = await prisma.user.update({
where: {
id
},
data: {
email,
profile: {
update: {
age
}
}
},
select: {
email: true
},
include: {
profile: true
}
})
return user
} catch (e) {
onError(e)
}
}
upsertОбновляет существующую или создает новую запись.
Сигнатура
upsert({
create: _data,
update: _data,
where: condition,
select? : fields,
include? : relations
})
Пример
async function updateOrCreateUser(data) {
const {userName, email, password} = data
try {
const hash = await argon2.hash(password)
const user = await prisma.user.create({
where: {
user_name: userName
},
update: {
email,
hash
},
create: {
email,
hash,
user_name: userName
},
select: {
user_name: true,
email: true
}
})
return user
} catch (e) {
onError(e)
}
}
deleteУдаляет существующую запись по идентификатору или уникальному полю.
Сигнатура
delete ({
where: condition,
select? : fields,
include? : relations
})
Пример
async function removeUserById(id) {
try {
await prisma.user.delete({
where: {
id
}
})
} catch (e) {
onError(e)
}
}
createManyСоздает несколько записей с помощью одной транзакции (о транзакциях мы поговорим отдельно).
Пример
createMany({
data: _data[],
skipDuplicates? : boolean
})
_data[]— данные для создаваемых записей в виде массива;skipDuplicates— при значенииtrueсоздаются только уникальные записи.Пример
// предположим, что `users` - это массив объектов
async function createUsers(users) {
try {
const users = await prisma.user.createMany({
data: users
})
return users
} catch (e) {
onError(e)
}
}
updateManyОбновляет несколько существующих записей за один раз и возвращает количество (sic) обновленных записей.
Сигнатура
updateMany({
data: _data[],
where? : condition
})
Пример
async function updateProductsByCategory(category, newDiscount) {
try {
const count = await prisma.product.updateMany({
where: {
category
},
data: {
discount: newDiscount
}
})
return count
} catch (e) {
onError(e)
}
}
deleteManyУдаляет несколько записей с помощью одной транзакции и возвращает количество удаленных записей.
Сигнатура
deleteMany({
where? : condition
})
Пример
async function removeAllPostsByUserId(author_id) {
try {
const count = await prisma.post.deleteMany({
where: {
author_id
}
})
return count
} catch (e) {
onError(e)
}
}
countВозвращает количество записей, соответствующих заданному критерию.
Сигнатура
count({
where? : condition,
select? : fields,
cursor? : position,
orderBy? : order,
skip? : number,
take? : number
})
Пример
async function countUsersWithPublishedPosts() {
try {
const count = await prisma.user.count({
where: {
post: {
some: {
published: true
}
}
}
})
return count
} catch (e) {
onError(e)
}
}
aggregateВыполняет агрегирование полей.
Сигнатура
aggregate({
where? : condition,
select? : fields,
cursor? : position,
orderBy? : order,
skip? : number,
take? : number,
_count: count,
_avg: avg,
_sum: sum,
_min: min,
_max: max
})
_count— возвращает количество совпадающих записей или неnull-полей;_avg— возвращает среднее значение определенного поля;_sum— возвращает сумму значений определенного поля;_min— возвращает наименьшее значение определенного поля;_max— возвращает наибольшее значение определенного поля.Пример
async function getAllUsersCountAndMinMaxProfileViews() {
try {
const result = await prisma.user.aggregate({
_count: {
_all: true
},
_max: {
profileViews: true
},
_min: {
profileViews: true
}
})
return result
} catch (e) {
onError(e)
}
}
groupByВыполняет группировку полей.
Сигнатура
groupBy({
by? : by,
having? : having,
where? : condition,
orderBy? : order,
skip? : number,
take? : number,
_count: count,
_avg: avg,
_sum: sum,
_min: min,
_max: max
})
by— определяет поле или комбинацию полей для группировки записей;having— позволяет фильтровать группы по агрегируемому значению.Пример
В следующем примере мы выполняем группировку поcountry / city, где среднее значениеprofileViewsпревышает100, и
возвращаем общее количество (_sum)profileViewsдля каждой группы. Запрос также возвращает количество всех (_all)
записей в каждой группе и все записи с неnullзначениями поляcityв каждой группе:
async function getUsers() {
try {
const result = await prisma.user.groupBy({
by: ['country', 'city'],
_count: {
_all: true,
city: true
},
_sum: {
profileViews: true
},
orderBy: {
country: 'desc'
},
having: {
profileViews: {
_avg: {
gt: 100
}
}
}
})
return result
} catch (e) {
onError(e)
}
}
createcreate: { data } | [{ data1 }, { data2 }, ...{ dataN }] — добавляет новую связанную запись или набор записей в
родительскую запись. create доступен при создании (create) новой родительской записи или обновлении (update)
существующей родительской записи.
const user = await prisma.user.create({
data: {
email,
profile: {
// вложенный запрос
create: {
first_name,
last_name
}
}
}
})
createManycreateMany: [{ data1 }, { data2 }, ...{ dataN }] — добавляет набор новых связанных записей в родительскую запись.
createMany доступен при создании (create) новой родительской записи или обновлении (update) существующей
родительской записи.
const userWithPosts = await prisma.user.create({
data: {
email,
posts: {
// !
createMany: {
data: posts
}
}
}
})
updateupdate: { data } | [{ data1 }, { data2 }, ...{ dataN }] — обновляет одну или более связанных записей.
const user = await prisma.user.update({
where: {
email
},
data: {
profile: {
// !
update: {
age
}
}
}
})
updateManyupdateMany: { data } | [{ data1 }, { data2 }, ...{ dataN }] — обновляет массив связанных записей. Поддерживается
фильтрация.
const result = await prisma.user.update({
where: {
id
},
data: {
posts: {
// !
updateMany: {
where: {
published: false
},
data: {
like_count: 0
}
}
}
}
})
upsertupsert: { data } | [{ data1 }, { data2 }, ...{ dataN }] — обновляет существующую связанную запись или создает новую.
const user = await prisma.user.update({
where: {
email
},
data: {
profile: {
// !
upsert: {
create: {
age
},
update: {
age
}
}
}
}
})
deletedelete: boolean | { data } | [{ data1 }, { data2 }, ...{ dataN }] — удаляет связанную запись. Родительская запись при
этом не удаляется.
const user = await prisma.user.update({
where: {
email
},
data: {
profile: {
delete: true
}
}
})
deleteManydeleteMany: { data } | [{ data1 }, { data2 }, ...{ dataN }] — удаляет связанные записи. Поддерживается фильтрация.
const user = await prisma.user.update({
where: {
id
},
data: {
age,
posts: {
// !
deleteMany: {}
}
}
})
setset: { data } | [{ data1 }, { data2 }, ...{ dataN }] — перезаписывает значение связанной записи.
const userWithPosts = await prisma.user.update({
where: {
email
},
data: {
posts: {
// !
set: newPosts
}
}
})
connectПодключает запись к существующей связанной записи по идентификатору или уникальному полю.
const user = await prisma.post.create({
data: {
title,
content,
author: {
connect: {
email
}
}
}
})
connectOrCreateПодключает запись к существующей связанной записи по идентификатору или уникальному полю либо создает связанную запись при отсутствии таковой.
disconnectОтключает родительскую запись от связанной без удаления последней. disconnect доступен только если отношение является
опциональным.