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