Segmenta использует Drizzle ORM для работы с базой данных. Поддерживаются MySQL и PostgreSQL — выбор диалекта задаётся переменной DATABASE_DIALECT.

Схемы таблиц

Все схемы находятся в packages/database/src/schema/. Каждый файл описывает одну или несколько связанных таблиц.
ФайлТаблицы
users.tsПользователи
sessions.tsСессии авторизации
servers.tsMinecraft серверы, моды, онлайн-игроки, боты, RCON
shop.tsМагазин: категории, товары, промокоды, корзины, покупки
tickets.tsТикеты поддержки: категории, тикеты, сообщения
payments.tsПлатежи
donations.tsПривилегии и привилегии пользователей
permissions.tsПрава доступа привилегий и пользователей
privilege-plans.tsТарифные планы привилегий
news.tsНовости
notifications.tsУведомления и настройки уведомлений
settings.tsНастройки сайта (key-value)
rules.tsПравила сервера: разделы и пункты
navigation.tsПункты навигации
seo-meta.tsSEO-метаданные страниц
user-connections.tsПодключённые аккаунты (Discord, VK и др.)
user-devices.tsУстройства пользователей
user-known-locations.tsИзвестные локации пользователей
user-verification-requests.tsЗапросы верификации
user-activity.tsАктивность пользователей
user-balances.tsБалансы пользователей
user-online-stats.tsСтатистика онлайна пользователей
user-passwords.tsПароли пользователей
user-two-factor.tsДвухфакторная аутентификация
security-settings.tsНастройки безопасности
module-states.tsСостояние модулей (вкл/выкл, настройки)
bans.tsБаны
punishments.tsНаказания, покупки разбана, интеграции
votes.tsГолосования: настройки и история
hwids.tsHWID игроков
launcher-sessions.tsСессии лаунчера
launcher-auth-requests.tsЗапросы авторизации лаунчера
email-verification-codes.tsКоды подтверждения email
password-reset-tokens.tsТокены сброса пароля
crash-reports.tsКраш-репорты
admin-logs.tsЛоги действий администраторов

Мульти-диалект

Segmenta поддерживает MySQL и PostgreSQL одновременно. Для каждой таблицы определяются две версии — xxxMysql и xxxPostgres, а активный набор схем выбирается в packages/database/src/schema/index.ts по флагу IS_POSTGRES (он вычисляется из переменной DATABASE_DIALECT в packages/database/src/config.ts):
import { IS_POSTGRES } from '../config';

export const schema: Schema = IS_POSTGRES ? postgresSchema : mysqlSchema;
Файл packages/database/src/schema/builder.ts экспортирует объекты mysqlSchemaBuilder и postgresSchemaBuilder с соответствующими хелперами колонок (table, varchar, text, int, boolean, timestamp, decimal, json, serial):
export const mysqlSchemaBuilder: SchemaBuilder<MySqlTableFn, 'mysql'> = {
  dialect: 'mysql',
  table: mysqlTable,
  varchar: mysqlVarchar,
  // ...
  serial: mysqlSerial,
};
При смене диалекта (DATABASE_DIALECT) нужно заново применить схему через pnpm db:push.

Команды

КомандаОписание
pnpm db:pushПрименить текущую схему к БД (без миграций)
pnpm db:generateСгенерировать файлы миграций
pnpm db:migrateПрименить миграции
pnpm db:seedЗаполнить начальные данные
pnpm db:studioОткрыть Drizzle Studio — веб-интерфейс для БД
pnpm db:full-resetПолный сброс: пересоздание схемы + сидинг
pnpm db:migrate-dataПеренос данных между диалектами (MySQL ↔ PostgreSQL)
Команда db:full-reset удаляет все данные. Используйте только в разработке.

Работа с БД в коде

Для выполнения запросов используются функции withDatabase и withTransaction из @segmenta/database (packages/database/src/client.ts). Те же функции доступны в контексте tRPC через ctx.withDatabase и ctx.withTransaction. Для ветвления логики по диалекту есть matchDatabase.

Простой запрос

const users = await ctx.withDatabase(({ db, schema }) =>
  db.select().from(schema.users).limit(10)
);

Транзакция

await ctx.withTransaction(async ({ db, schema }) => {
  await db.insert(schema.payments).values({ ... });
  await db.update(schema.users).set({ ... }).where(eq(schema.users.id, userId));
});

Доступ к схемам модулей

Функции withDatabase и withTransaction в tRPC-контексте автоматически подмешивают схемы модулей в объект schema. Это значит, что внутри роутера модуля вы можете обращаться к своим таблицам так же, как к основным.

Сидинг

Файл packages/database/src/seed.ts (pnpm db:seed) заполняет настройки сайта по умолчанию из defaultSettings (packages/database/src/schema/settings.ts). Существующие настройки не перезаписываются. Полный сброс packages/database/src/scripts/full-reset.ts (pnpm db:full-reset) пересоздаёт схему, запускает базовый сид настроек, а затем вставляет демонстрационные данные: тестовых пользователей (включая администратора с правом *), серверы, привилегии и их тарифы, правила, данные форума и краш-репорты.
Параметры сидинга задаются прямо в коде указанных файлов — отдельного конфигурационного файла нет.