Я близок к тому, чтобы мой проект был готов к запуску. У меня большие планы после запуска, и структура базы данных изменится - новые столбцы в существующих таблицах, а также новые таблицы и новые ассоциации с существующими и новыми моделями.
Я еще не коснулся миграций в 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 для всего, и это довольно здорово, когда вы к этому привыкнете. Редактировать: И да, я заметил, что этот вопрос довольно старый, но, поскольку никогда не было удовлетворительного ответа, и люди могут приходить сюда в поисках руководства, я решил, что должен внести свой вклад.Ответы:
Генерация «первой миграции»
В вашем случае самый надежный способ - сделать это практически вручную. Я бы предложил использовать инструмент sequelize-cli . Синтаксис довольно прост:
Это создаст модель и миграцию. Затем вручную объедините существующие модели с созданными с помощью sequelize-cli и сделайте то же самое с миграциями. После этого сотрите базу данных (если возможно) и запустите
Это создаст схему миграции. Вы должны сделать это только один раз, чтобы переключиться на правильный процесс разработки схемы (без sync: force, но с принудительными миграциями).
Позже, когда вам нужно изменить схему:
sequelize migration:create
sequelize db:migrate
Запуск миграций на производстве
Очевидно, что вы не можете подключиться к производственному серверу и выполнить миграцию вручную. Используйте umzug , независимый от среды инструмент миграции для Node.JS, чтобы выполнить отложенные миграции до запуска приложения.
Вы можете получить список ожидающих / еще не выполненных миграций:
Затем выполните миграцию ( внутри обратного вызова ). Метод execute - это функция общего назначения, которая запускает для каждой указанной миграции соответствующую функцию:
И я предлагаю сделать это до запуска приложения и каждый раз пытаться обслуживать маршруты. Что-то вроде этого:
Я не могу попробовать это прямо сейчас, но на первый взгляд это должно работать.
UPD апрель 2016
Через год все еще полезно, поэтому делюсь своими текущими советами. Сейчас я устанавливаю
sequelize-cli
пакет, как требуется, в режиме реального времени , а затем изменяю сценарии запуска NPMpackage.json
следующим образом:Единственное, что мне нужно сделать на рабочем сервере, это
npm start
. Эта команда запустит все миграции, применит все сидеры и запустит сервер приложений. Не нужно звонить в умзуг вручную.источник
pending
а затемexecute
и просто сделатьumzug.up().then(function (migrations) { app.listen(3000); })
. Согласно документации umzug, он выполнит все ожидающие миграции.Просто изучаю это сам, но я думаю, что сейчас рекомендую использовать миграции, чтобы вы к ним привыкли. Я обнаружил, что для выяснения того, что происходит в процессе миграции, лучше всего взглянуть на sql созданных таблиц,
sequelize.sync()
а затем построить миграции оттуда.Создаст файл миграции шаблона в каталоге миграции. Затем вы можете заполнить его полями, которые вам нужны. Этот файл должен включать
createdAt
/updatedAt
, поля, необходимые для ассоциаций и т. Д.Для первоначального создания таблицы вниз должен иметь:
Но последующие обновления структуры таблицы могут не учитывать это и просто использовать alter table.
Пример создания будет выглядеть так:
Чтобы повторить с начала:
Я использую кофе, чтобы запустить начальный файл для заполнения таблиц после:
Это просто имеет функцию создания, которая выглядит примерно так:
Не забудьте убрать свой
sync()
индекс из ваших моделей, иначе он перезапишет то, что делают миграции и начальное число.Документы можно найти по адресу http://sequelize.readthedocs.org/en/latest/docs/migrations/ . Но основной ответ заключается в том, что вы должны добавить в себя все, чтобы указать нужные поля. Это не делает это для вас.
источник
sequelize.sync()
быть сгенерированного скрипта, который создает все базовые таблицы и индексы в качестве первой миграции (аналогично rails 'schema.rb
.) После прочтения этого, вам, вероятно, лучше всего будет экспортировать исходную схему как sql, а затем внесите это в большойexec
оператор в вашей первой миграции. Затем вы запускаете инкрементные изменения для известной отправной точки "версии 1.0".Для разработки теперь есть возможность синхронизировать текущие таблицы, изменяя их структуру. Используя последнюю версию репозитория sequelize github , теперь вы можете запустить синхронизацию с
alter
параметром.Предостережение от документов:
источник
Теперь с новой последовательностью миграции очень просто.
Это пример того, что вы можете сделать.
Помните, что вы должны установить:
"dialectOptions": { "multipleStatements": true }
в конфигурации базы данных.
источник
Используйте версию. Версия приложения зависит от версии базы данных. Если новая версия требует обновления базы данных, создайте для нее миграцию.
обновление: я решил отказаться от миграции ( KISS ) и запустить скрипт update_db (sync forse: false), когда это необходимо.
источник
sync()
, и что мне нужно вручную записать переносы со схем моделей более старых версий в модели более новых версий?Немного поздно, и после прочтения документации вам не понадобится та первая миграция, о которой вы говорите. Все, что вам нужно сделать, это позвонить
sync
, чтобы создать таблицы.sequelize.sync()
Вы также можете запустить простую синхронизацию модели, выполнив что-то вроде:
Project.sync()
но я думаю, чтоsequelize.sync()
это более полезный общий случай для вашего проекта (если вы импортируете хорошие модели во время запуска).(взято с http://sequelizejs.com/docs/latest/models#database-synchronization )
Это создаст все начальные структуры. После этого вам нужно будет только создать миграции, чтобы развить ваши схемы.
Надеюсь, поможет.
источник
sequelize.sync()
том, что он делает.Sequelize может запускать произвольный SQL асинхронно .
Что бы я сделал, это:
mysql_dump -uUSER -pPASS DBNAME > FILE.SQL
var baseSQL = "LOTS OF SQL and it's EVIL because you gotta put \ backslashes before line breakes and \"quotes\" and/or sum" + " one string for each line, or everything will break";
var baseSQL = fs.readFileSync('../seed/baseDump.sql');
Это должно позаботиться о настройке базы данных, хотя асинхронность может стать проблемой. Если это произойдет, я бы посмотрел на способ отложить возврат
up
функции sequelize до завершения асинхроннойquery
функции.Подробнее о mysql_dump: http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html
Подробнее о сиквелизированной миграции: http://sequelize.readthedocs.org/en/latest/docs/migrations/
Подробнее Запуск SQL из Sequelize Migration: https://github.com/sequelize/sequelize/issues/313
источник
Вот мой текущий рабочий процесс. Я открыт для предложений.
Таким образом, вам не нужно вручную обновлять таблицу миграции и беспокоиться о толстых пальцах, но вы все равно получаете ORM.
источник
Друг, у меня был такой же вопрос и мне удалось понять, как их использовать.
Я начал без ORM sequelize, поэтому у меня уже была модель данных.
Мне пришлось генерировать модели автоматически с помощью sequelize-auto и генерировать их миграции с помощью этого файла, который вы создаете https://gist.github.com/ahelord/a7a7d293695b71aadf04157f0f7dee64 и помещаете в sync (
{Force: false}
).Это в dev.I, мне нужно для версии модель и миграции и выполнять их каждый раз, когда я вытащить код.
В рабочем состоянии сервер находится только наверху, поэтому вам нужно только запустить миграцию и в каждом коммите управлять, так как вы будете управлять версией модели, не останавливая бэкэнд
источник
Я просмотрел этот пост и другие подобные вопросы, но он мне не ответил. Миграции полезны для раскрутки локальных баз данных и обновления данных в рабочей среде.
Я задал вопрос здесь и также ответил на него: рабочий процесс для обработки последовательных миграций и инициализации?
Версия TL-DR для нового проекта
.sql
файл поверхsequelize init:migrate
в любой папке, где выmodels
находитесь вsequelize migration:generate --name [name_of_your_migration]
с этой общей структурой папок
sequelize migration:generate --name [name_of_your_migration]
up
и наdown
пути миграции. Это ваши операторы ALTER для изменения имен столбцов, DELETE, ADD столбцов и т. Д.sequelize db:migrate
npm install sequelize-auto
.sequelize-auto -o "./models" -d sequelize_auto_test -h localhost -u my_username -p 5432 -x my_password -e postgres
найденную в https://github.com/sequelize/sequelize-autoВы можете использовать git, чтобы увидеть difflogs в вашей модели, должны быть только изменения, отражающие изменения в модели базы данных. Как примечание, никогда не изменяйте
models
напрямую, если вы используетеsequelize auto
, так как это сгенерирует их для вас. Кроме того, вам больше не нужно изменять схему базы данных напрямую с помощью файлов SQL, если это опция, поскольку вы можете импортировать и эти.sql
файлы.Теперь ваша схема базы данных обновлена, и вы официально перешли к сиквелизации только миграций базы данных.
Все контролируется версией. Это идеальный рабочий процесс для базы данных и внутреннего разработчика
источник
Есть еще более простой способ (избегая Sequalize). Который идет так:
Вы вводите команду внутри вашего проекта: npm run migrate: new
Это создает 3 файла. Файл js и два файла sql с именами вверх и вниз
Чтобы это работало, взгляните на модуль db-migrate .
После того, как вы настроите его (что не сложно), изменение вашей БД действительно легко и экономит много времени.
источник