cheatsheets

Запросы

findUnique

Позволяет извлекать единичные записи по идентификатору или уникальному полю.

Сигнатура

findUnique({
    where: condition,
    select? : fields,
    include? : relations,
    rejectOnNotFound? : boolean
})

Модификатор?означает, что поле является опциональным.

Пример

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
})

Пример

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
})

Пример

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
})

Пример

// предположим, что `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
})

Пример

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
})

Пример

В следующем примере мы выполняем группировку по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)
    }
}

Вложенные запросы

create

create: { data } | [{ data1 }, { data2 }, ...{ dataN }] — добавляет новую связанную запись или набор записей в родительскую запись. create доступен при создании (create) новой родительской записи или обновлении (update) существующей родительской записи.

const user = await prisma.user.create({
  data: {
    email,
    profile: {
      // вложенный запрос
      create: {
        first_name,
        last_name
      }
    }
  }
})

createMany

createMany: [{ data1 }, { data2 }, ...{ dataN }] — добавляет набор новых связанных записей в родительскую запись. createMany доступен при создании (create) новой родительской записи или обновлении (update) существующей родительской записи.

const userWithPosts = await prisma.user.create({
  data: {
    email,
    posts: {
      // !
      createMany: {
        data: posts
      }
    }
  }
})

update

update: { data } | [{ data1 }, { data2 }, ...{ dataN }] — обновляет одну или более связанных записей.

const user = await prisma.user.update({
  where: {
    email
  },
  data: {
    profile: {
      // !
      update: {
        age
      }
    }
  }
})

updateMany

updateMany: { data } | [{ data1 }, { data2 }, ...{ dataN }] — обновляет массив связанных записей. Поддерживается фильтрация.

const result = await prisma.user.update({
  where: {
    id
  },
  data: {
    posts: {
      // !
      updateMany: {
        where: {
          published: false
        },
        data: {
          like_count: 0
        }
      }
    }
  }
})

upsert

upsert: { data } | [{ data1 }, { data2 }, ...{ dataN }] — обновляет существующую связанную запись или создает новую.

const user = await prisma.user.update({
  where: {
    email
  },
  data: {
    profile: {
      // !
      upsert: {
        create: {
          age
        },
        update: {
          age
        }
      }
    }
  }
})

delete

delete: boolean | { data } | [{ data1 }, { data2 }, ...{ dataN }] — удаляет связанную запись. Родительская запись при этом не удаляется.

const user = await prisma.user.update({
  where: {
    email
  },
  data: {
    profile: {
      delete: true
    }
  }
})

deleteMany

deleteMany: { data } | [{ data1 }, { data2 }, ...{ dataN }] — удаляет связанные записи. Поддерживается фильтрация.

const user = await prisma.user.update({
  where: {
    id
  },
  data: {
    age,
    posts: {
      // !
      deleteMany: {}
    }
  }
})

set

set: { 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 доступен только если отношение является опциональным.