← назад к разделу

Схема базы меняется через версионируемые миграции. synchronize: true сравнивает entities с текущей схемой и меняет ее автоматически - удобный эксперимент, плохой production-процесс.

Миграция как код для ревью

npx typeorm migration:generate src/migrations/AddProductPrice -d src/data-source.ts
npx typeorm migration:run -d src/data-source.ts

migration:generate предлагает изменения по entities, но не понимает намерение. Перед run читают SQL: удаление колонки, пересоздание таблицы и изменение типа могут удалить данные или заблокировать ее.

migration:revert откатывает последнюю миграцию только если сама миграция реализует обратную операцию. Для удаленных данных обратный SQL их не восстанавливает.

Безопасный путь изменения

Для нового поля сначала добавляют nullable-колонку, затем заполняют ее отдельной миграцией или фоновой задачей, после чего добавляют ограничение. Код, который ожидает новую схему, выкатывают после совместимой базы.

Для удаления сначала прекращают использовать поле, убеждаются, что старый код не зависит от него, и только потом удаляют. Для смены типа проверяют преобразование на копии production-объема и блокировки.

migrationsRun: true запускает миграции при старте каждой реплики. Если реплик несколько, порядок и одновременный запуск согласуют с deployment, а не надеются на случай.

Коротко

  • Автогенерированный SQL читают до применения.
  • synchronize не заменяет миграции.
  • Обратная миграция не восстанавливает удаленные данные.
  • Схему и код выкатывают совместимыми шагами.
  • Запуск на нескольких репликах координируют.

Что почитать дальше