Документация
База данных

Для разработчиков

Руководство по разработке базы данных

В этом руководстве описаны архитектура базы данных и правила разработки проекта. В проекте используется Drizzle ORM как инструмент для работы с БД.

Архитектура базы данных

Все файлы Schema находятся в каталоге src/db/:

ФайлОписание
auth.schema.tsПользователи, сессии, аккаунты, коды подтверждения
subscription.schema.tsУправление подписками
payment.schema.tsПлатежные записи
order.schema.tsУправление заказами
credit.schema.tsСистема кредитов
rbac.schema.tsУправление доступом (роли, права)
config.schema.tsСистемные настройки

Работа с базой данных

Импортируйте экземпляр db и Schema из @/db:

import { db, user } from "@/db"
import { eq } from "drizzle-orm"

// Запрос
const users = await db.select().from(user)

// Запрос с условием
const result = await db.select().from(user).where(eq(user.id, "xxx"))

// Вставка
await db.insert(user).values({ id: "xxx", name: "test", email: "test@example.com" })

// Обновление
await db.update(user).set({ name: "new name" }).where(eq(user.id, "xxx"))

// Удаление
await db.delete(user).where(eq(user.id, "xxx"))

Вывод типов

Типы таблиц базы данных должны выводиться из Schema в src/shared/types/, а не объявляться вручную:

import type { user } from "@/db/auth.schema"

// Полный тип, выведенный из таблицы
export type User = typeof user.$inferSelect

// Тип, выведенный из enum
import type { paymentStatusEnum } from "@/db/payment.schema"
export type PaymentStatus = (typeof paymentStatusEnum.enumValues)[number]

Часто используемые команды

# Создать файл миграции
pnpm db:generate

# Выполнить миграцию
pnpm db:migrate

# Отправить изменения схемы в базу данных (разработка)
pnpm db:push

# Считать Schema из базы данных
pnpm db:pull

# Открыть Drizzle Studio
pnpm db:studio

Добавление новой таблицы

Создание файла Schema

Создайте новый файл Schema в каталоге src/db/:

src/db/example.schema.ts
import { pgTable, text, timestamp } from "drizzle-orm/pg-core"

export const example = pgTable("example", {
  id: text("id").primaryKey(),
  name: text("name").notNull(),
  createdAt: timestamp("created_at").defaultNow().notNull(),
})

Экспорт Schema

Экспортируйте его в src/db/index.ts:

export * from "./example.schema"
import * as exampleSchema from "./example.schema"

const schema = {
  // ... остальные schema
  ...exampleSchema,
}

Создание миграции

Выполните команду для генерации файла миграции:

pnpm db:generate

Содержание