Я близок к тому, что мой проект готов к запуску. У меня есть большие планы после запуска, и структура базы данных изменится - новые столбцы в существующих таблицах, а также новые таблицы и новые ассоциации с существующими и новыми моделями.
Я еще не затронул миграцию в Sequelize, так как у меня только были данные тестирования, которые я не против уничтожать при каждом изменении базы данных.
С этой целью в настоящее время я запускаю sync force: true
, когда мое приложение запускается, если я изменил определения модели. Это удаляет все таблицы и делает их с нуля. Я мог бы опустить параметр force
, чтобы он создавал только новые таблицы. Но если существующие изменились, это не полезно.
Итак, как только я добавляю в миграцию, как все работает? Очевидно, что я не хочу, чтобы существующие таблицы (с данными в них) были уничтожены, поэтому sync force: true
не может быть и речи. В других приложениях я помог разработать (Laravel и другие фреймворки) в рамках процедуры развертывания приложения, мы запускаем команду migrate для запуска любых ожидающих миграции. Но в этих приложениях первая миграция имеет скелетную базу данных с базой данных в состоянии, где было некоторое время на ранней стадии разработки - первой альфа-версии или что-то еще. Таким образом, даже экземпляр приложения с опозданием на вечеринку может ускориться за один раз, выполнив все миграции в последовательности.
Как создать такую "первую миграцию" в Sequelize? Если у меня его нет, новый экземпляр приложения каким-либо образом пойдет по строке либо не будет иметь базы данных скелета для запуска миграции, либо он будет запускать синхронизацию в начале и сделает базу данных в новом состоянии со всеми новые таблицы и т.д., но затем, когда он пытается запустить миграции, они не будут иметь смысла, поскольку они были написаны с исходной базой данных и каждой последовательной итерацией.
Мой мыслительный процесс: на каждом этапе исходная база данных плюс каждая миграция в последовательности должны быть равны (плюс или минус данные), сгенерированные при запуске sync force: true
. Это связано с тем, что описания моделей в коде описывают структуру базы данных. Так что, возможно, если нет таблицы миграции, мы просто запускаем синхронизацию и отмечаем все миграции как выполненные, хотя они не были запущены. Это то, что мне нужно делать (как?), Или Sequelize, как предполагается, делать это сам, или я лаяю неправильное дерево? И если я нахожусь в правильной области, наверняка должен быть хороший способ автоматически генерировать большую часть миграции, учитывая старые модели (путем хеширования или даже привязать каждую миграцию к фиксации?) Я соглашаюсь, что я думаю в не-переносной git -центрической вселенной) и новых моделях. Он может различать структуру и генерировать команды, необходимые для преобразования базы данных из старой в новую и обратно, а затем разработчик может входить и делать любые необходимые настройки (удаление/переход определенных данных и т.д.).
Когда я запускаю сиквел-бинарный код с помощью команды --init
, он дает мне пустой каталог миграции. Когда я запускаю sequelize --migrate
, он делает мне таблицу SequelizeMeta, в которой нет ничего, никаких других таблиц. Очевидно, нет, потому что этот двоичный файл не знает, как загружать мое приложение и загружать модели.
Мне что-то не хватает.
TL;DR: как настроить мое приложение и его миграции, чтобы можно было обновить различные экземпляры live-приложения, а также совершенно новое приложение без старой исходной базы данных?