Краткий обзор основных директив Prisma

Prisma – это ORM нового поколения с открытым исходным кодом.

Prisma генерирует CRUD-операции, что экономит кучу времени и сил. Однако этот инструмент предлагает несколько функций, способных сэкономить еще больше времени и предоставить еще более точный контроль над структурой данных.

В этом мануале мы изучим наиболее распространенные директивы, которые используются в схемах.

Требования

Поскольку мы собираемся улучшить схемы, рекомендуем освежить знания по этой теме в мануале Схемы и распознаватели GraphQL.

Вам также понадобится базовая установка контейнера Prisma с базой данных. Вы можете настроить Prisma с помощью Docker или же просто скопировать этот репозиторий и развернуть его в новом контейнере.

Директива unique

Предположим, у нас есть приложение, и мы хотим добавить в него нового пользователя, одновременно защищая приложение от пользователей с тем же адресом электронной почты. Вместо того чтобы вручную отправлять запрос и проверять, существуют ли такие данные в базе, прежде чем сохранить их, мы можем использовать директиву @unique, которая сделает это за нас. У идентификаторов есть собственный специальный эквивалент, @id.

type User {
  id: ID! @id
  name: String!
  email: String! @unique
  age: Int!
}

Так наше приложение сможет сообщить пользователю, что указанные данные нельзя использовать (если мутация не удалась).

Директива default

Часто для создания учетной записи пользователя нужны данные, которые лучше заполнять автоматически (иначе вручную он может установить себе больше привилегий, например). Для этих типов данных было бы очень полезно добавлять значения по умолчанию.

Самый простой способ сделать это – просто использовать директиву @default, которая позволяет добавлять значения-заполнители.

type User {
  id: ID! @id
  name: String!
  email: String! @unique
  type: UserType! @default(value: USER)
}

enum UserType {
  USER
  ADMIN
}

Директива rename

Поскольку структуры данных собираются не навсегда, нам в конечном итоге придется что-то менять. Prisma довольно хорошо умеет добавлять и удалять новые свойства и типы, но у нее могут возникнуть некоторые проблемы, если вы захотите переименовать тип, для которого уже были сохранены зависящие от него данные.

@rename – временная директива. То есть мы используем ее один раз при повторном развертывании схемы, а затем удаляем из datamodel.graphql.

type User {
  id: ID! @id
  name: String!
  email: String!
  posts: [Content!]
}

type Content {
  id: ID! @id
  title: String! @unique
  body: String!
  author: User!
}

Имя Content довольно расплывчатое. Давайте используем @rename, чтобы заменить его чем-то более описательным.

type User {
  id: ID! @id
  name: String!
  email: String!
  posts: [Content!]
}

type Post @rename(oldName: "Content") {
  id: ID! @id
  title: String! @unique
  body: String!
  author: User!
}

Переместитесь в папку prisma и повторно разверните схему.

$ prisma deploy

Теперь можно просто удалить @rename, никак не повлияв на данные.

Директива relation

Самая полезная и распространенная вещь, которую вы будете делать с директивами, – это устанавливать отношения между типами данных.

Предположим, если бы мы удалили продукт из нашего магазина, мы, конечно, захотели бы удалить из БД и все отзывы о нем. Соответственно, если бы мы удалили аккаунт продавца, мы бы удалили его продукты и отзывы. Проблема в том, что для организации этой иерархии нужен особый способ, потому что мы не хотим удалять аккаунт продавца, удаляя товар или отзыв.

Директива @relation решает эту проблему: нужно просто передать ей имя, которое свяжет два типа и сообщит ей, что именно требуется сделать при onDelete (остановиться или продолжить удаление по цепочке). CASCADE удалит тип с другой стороны цепочки, а SET_NULL оставит его.

type User {
  id: ID! @id
  name: String!
  selling: [Product!] @relation(name: "UserToProduct", onDelete: CASCADE)
}

type Product {
  id: ID! @id
  name: String!
  seller: User! @relation(name: "UserToProduct", onDelete: SET_NULL)
  reviews: [Review!] @relation(name: "ProductToReview", onDelete: CASCADE)
}

type Review {
  id: ID! @id
  author: User!
  review: String!
  product: Product! @relation(name: "ProductToReview", onDelete: SET_NULL)
}

Заключение

Вот директивы Prisma, которые используются чаще всего. Если вы хотите более подробно изучить эту тему, обратитесь к официальной документации.

Tags: , ,

Добавить комментарий