База данных
Для разработчиков
Руководство по разработке базы данных
В этом руководстве описаны архитектура базы данных и правила разработки проекта. В проекте используется 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/:
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,
}