ss14-migrations
Руководство по созданию и управлению миграциями баз данных в SS14 (PostgreSQL и SQLite)
Install
mkdir -p .claude/skills/ss14-migrations-punker-corporation && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/14022" && unzip -o skill.zip -d .claude/skills/ss14-migrations-punker-corporation && rm skill.zipInstalls to .claude/skills/ss14-migrations-punker-corporation
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Руководство по созданию и управлению миграциями баз данных в SS14 (PostgreSQL и SQLite)About this skill
🚀 Миграции Баз Данных SS14 (Database Migrations)
Этот навык описывает процесс создания и применения миграций базы данных в Space Station 14. Поскольку SS14 поддерживает и PostgreSQL, и SQLite, все изменения должны быть мигрированы для обоих движков.
🎯 Когда использовать этот навык
- При изменении моделей базы данных (
Model.cs). - При добавлении новых таблиц или столбцов.
- При переименовании или удалении существующих структур БД.
- Когда сервер падает при запуске с ошибкой "Applying Migrations".
⚔️ Система Двойной Миграции
SS14 поддерживает два отдельных набора миграций:
- SQLite Config:
Content.Server.Database/Migrations/Sqlite - PostgreSQL Config:
Content.Server.Database/Migrations/Postgres
Это необходимо, потому что у движков разные типы данных, фичи и диалекты SQL. Одна миграция обычно не может быть применена к обоим сразу.
🛠️ Скрипты-помощники
В репозитории есть скрипты для упрощения добавления миграций сразу в оба контекста:
- Windows (PowerShell):
Content.Server.Database/add-migration.ps1 - Linux/Mac (Bash):
Content.Server.Database/add-migration.sh
📝 Создание Миграции
Предварительные требования
- Запустите базу данных (если используете локальный Postgres).
- Убедитесь, что ваши изменения в
Model.csкомпилируются.
Шаги
-
Перейдите в директорию проекта базы данных:
cd Content.Server.Database -
Запустите скрипт с понятным именем (CamelCase):
./add-migration.ps1 MyNewFeatureЕсли скрипт упал или нужен ручной контроль, вот эквивалентные команды
dotnet ef:# Создание миграции для SQLite dotnet ef migrations add --context SqliteServerDbContext -o Migrations/Sqlite MyNewFeature # Создание миграции для Postgres dotnet ef migrations add --context PostgresServerDbContext -o Migrations/Postgres MyNewFeature -
Проверьте Созданные Файлы:
Migrations/Sqlite/YYYYMMDDHHMMSS_MyNewFeature.csMigrations/Postgres/YYYYMMDDHHMMSS_MyNewFeature.cs
✅ Чек-лист Проверки
- Предупреждения о потере данных: EF Core предупредил, что данные могут быть потеряны (например, при удалении столбца)?
- Совместимость Типов:
- Убедитесь, что миграции SQLite не пытаются использовать типы Postgres, такие как
inetилиjsonb, без конвертации (это должно обрабатываться вDbContext).
- Убедитесь, что миграции SQLite не пытаются использовать типы Postgres, такие как
- Raw SQL: Если вы использовали
migrationBuilder.Sql("..."), убедитесь, что SQL совместим с конкретным движком этой миграции.
🚫 Антипаттерны (Чего НЕ делать)
❌ 1. Забыть про один из движков
Симптом: Сервер работает локально (SQLite), но падает на проде (Postgres) или наоборот. Почему: Рассинхрон схемы БД. EF Core не найдет нужную миграцию. Как надо: Всегда проверяйте, что в обеих папках есть файл миграции с одним таймстампом/именем.
❌ 2. Сложные изменения схемы в SQLite
Проблема: SQLite имеет ограниченную поддержку ALTER TABLE (например, нельзя переименовать столбец или изменить его тип без пересоздания таблицы).
Последствия: EF Core попытается создать временную таблицу, скопировать все данные, удалить старую и переименовать новую. Это очень медленно на больших таблицах и опасно.
Как надо: Избегайте сложных изменений (rename column, change column type) для SQLite, если возможно. Лучше добавить новый столбец и пометить старый как устаревший (Obsolete).
❌ 3. Циклические зависимости при билде
Проблема: Добавление миграции требует сборки проекта, но проект не собирается, так как вы используете новое поле в коде, которого еще нет в БД (или наоборот). Правильный поток:
- Измените
Model.cs(добавьте свойство). - Соберите проект (код компилируется, но БД рассинхронизирована).
- Создайте миграцию.
- Обновите БД (происходит автоматически при старте сервера).
❌ 4. Изменение уже влитых миграций
Плохо: Редактировать файл миграции, который уже был влит в master и задеплоен.
Почему: Это сломает историю миграций у всех остальных разработчиков и на серверах. __EFMigrationsHistory будет содержать хэш старой версии, и EF Core упадет.
Как надо: Если нашли баг в старой миграции — создайте новую миграцию, которая исправляет проблему.
🗑️ Удаление (откат) локальной миграции
Если вы создали миграцию, но передумали (и еще не закоммитили/не влили её):
# Удаляет последнюю миграцию из контекста
dotnet ef migrations remove --context SqliteServerDbContext
dotnet ef migrations remove --context PostgresServerDbContext