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