Зачем в конфигурации TypeORM (обычно "typeorm-cli.config.ts") указывать все миграции?

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

В этом вопросе я бы хотел рассмотреть случай режима продакшен с использованием Docker, когда у нас одна изменяющаяся со временем база данных (то есть нет такого, что мы её многократно удаляем и создаём заново, как это может допускаться в режиме локальной разработки). Эта база данных хранится в Docker-томе (volume).

Согласно документации TypeORM, в режиме продакшен устанавливать опцию synchronize в значение true небезопасно, так как это может привести к потере данных. При таком раскладе могу предположить, что порядок развёртывания базы данных (повторюсь: в режиме продакшен) и дальнейшей работы будет таким:

  1. Выполнить миграцию, создающую базу данных c начальным набором таблиц
  2. Начать наполнять её данными
  3. Если в структуре возникнут какие-либо изменения, то один раз запустить соответствующую новую миграцию

Таким образом, если не мы будет ничего откатывать, то каждая миграция будет выполнена только один раз.

Ввиду этого, не совсем понятно, зачем нужно указывать миграции в массиве migrations в настройках TypeORM:

export default new DataSource({
  type: 'postgres',
  host: 'localhost',
  port: 5432,
  username: 'postgres',
  password: 'pass123',
  database: 'postgres',
  entities: [ Entity1, Entity2 ],
  migrations: [ Refactor1234, AddNewColumn2345 ],
});

Могу предположить, что это как история изменений.

Выглядит это так, как будто мы будем многократно создавать базу данных, причём не в один этап, а последовательно выполняя миграции. Ничего подобного я продакшене не планирую (вернее, не вижу в этом смысла).


Ответы (1 шт):

Автор решения: newman

Смысл миграции в том что она позволяет изменить структуру базы данных, грубо говоря из любого состояния.

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

А если в команде несколько человек, то уже появляются нюансы. Например, человек ушел в отпуск. А за эти две недели команда сделала несколько миграций и все обновили свои локальные системы. Т.е. сделали миграцию. Влили в продакшен - залили ее все локально. И так по кругу.

А вот, что делать человеку, который вернулся из отпуска? Скачает он из репозитория свежий код и свежие миграции. А как ему понять какие миграции надо применять? Копаться в истории изменений? Или у коллег спрашивать?

Другие случае тоже возможны. Но в общем-то четких и прописных истин нет. Удобно вам делать так как вы хотите и остальная команда не против - делайте. Пару раз на грабли наступите - поменяете концепцию. А может и не наступите.

→ Ссылка