Что такое Prisma schema

Ответ

Prisma schema — это файл schema.prisma, который определяет структуру базы данных, модели данных и их связи. Он используется ORM Prisma для генерации клиента, миграций и типов.

Основные элементы:

  • datasource — настройки подключения к БД (PostgreSQL, MySQL и др.)
  • generator — конфигурация клиента (например, prisma-client-js)
  • model — описание таблиц/коллекций и их полей

Пример:

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

model User {
  id      Int     @id @default(autoincrement())
  email   String  @unique
  name    String?
  posts   Post[]
}

model Post {
  id      Int     @id @default(autoincrement())
  title   String
  author  User    @relation(fields: [authorId], references: [id])
  authorId Int
}

Схема компилируется в TypeScript-типы и клиент для работы с БД.

Ответ 18+ 🔞

А, ну это ж та самая штука, которая у меня в проекте вечно вызывает вопросы! Prisma schema, блядь. Файлик schema.prisma, который сидит в корне и выглядит, будто на каком-то инопланетном диалекте JSON'а написан.

Короче, это такой священный текст для твоей базы данных. В нём ты, по сути, рисуешь карту: вот тут у нас будут жить пользователи, вот тут — посты, а вот эта стрелочка значит, что они, блядь, связаны.

Состоит он из трёх основных кусков, как бутерброд:

  1. datasource db — это типа "куда тыкаться". Тут пишешь, с какой базой работаешь (PostgreSQL, MySQL, да хоть с SQLite) и откуда брать пароль. Обычно пароль в переменных окружения прячут, а то какой-нибудь шутник подсмотрит.
  2. generator client — инструкция для фабрики. Говоришь: "Сгенерируй-ка мне, дружок, TypeScript-клиент, чтобы я мог с базой общаться нормальным языком, а не SQL-заклинаниями".
  3. model — а вот это самое сокровенное. Каждая такая штука — это будущая таблица в базе. Ты объявляешь поля: id, email, name. И главное — связи! Видишь posts Post[] в модели User? Это магия, ёпта. Это значит "у одного юзера может быть много постов". А в модели Post author User — это обратная связь, что пост принадлежит одному автору. Prisma потом сам за тебя эти JOIN'ы строит, красота!

Вот смотри, пример, как это выглядит вживую:

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL") // Смотри в .env файл, там ссылка лежит!
}

generator client {
  provider = "prisma-client-js"
}

model User {
  id      Int     @id @default(autoincrement()) // Главный ключ, сам растёт
  email   String  @unique // Чтобы два васяна на одну почту не зарегились
  name    String? // Вопросик значит, что можно и без имени
  posts   Post[]  // Вот она, связь! Массив постов этого юзера
}

model Post {
  id      Int     @id @default(autoincrement())
  title   String
  author  User    @relation(fields: [authorId], references: [id]) // Привязка к автору
  authorId Int // А вот тут реальный ID автора в базе лежит
}

Потом ты эту схему компилируешь командой npx prisma generate, и Prisma, как волшебник-недоучка, нагенерирует тебе кучу красивых TypeScript-типов и клиент. И ты уже в коде пишешь не "SELECT * FROM users WHERE id = ?", а prisma.user.findUnique({ where: { id: 1 } }). Удобно, блядь, как швейцарский нож! Главное, схему правильно описать, а то потом миграции городить — тот ещё пиздец.