Я близький до того, щоб мій проект був готовий до запуску. У мене є великі плани після запуску, і структура бази даних буде змінюватися - нові стовпці в існуючих таблицях, а також нові таблиці та нові асоціації з існуючими та новими моделями.
Я ще не торкнувся міграції в Sequelize, оскільки у мене були лише дані тестування, які я не проти витирати щоразу, коли змінюється база даних.
З цією метою в даний час я працюю sync force: true
при запуску програми, якщо я змінив визначення моделі. Це видаляє всі таблиці та робить їх з нуля. Я можу пропустити force
варіант, щоб він створював лише нові таблиці. Але якщо існуючі змінилися, це не корисно.
Отже, як тільки я додаю під час міграції, як все працює? Очевидно, я не хочу, щоб існуючі таблиці (з даними в них) були вилучені, тому питання не sync force: true
виникає. В інших програмах, які я допомагав розробляти (Laravel та інші рамки) в рамках процедури розгортання програми, ми запускаємо команду migrate для запуску будь-яких очікуваних міграцій. Але в цих додатках найперша міграція має скелетну базу даних, із базою даних у тому стані, де це було деякий час на початку розробки - перший альфа-реліз чи що завгодно. Тож навіть екземпляр програми, що спізнюється з учасником, може швидко набирати швидкість, запускаючи всі міграції послідовно.
Як створити таку "першу міграцію" в Sequelize? Якщо у мене його немає, новий екземпляр програми, який-небудь вниз по лінії, або не матиме бази даних скелета для запуску міграцій, або він запустить синхронізацію на старті і зробить базу даних у новому стані з усіма нові таблиці тощо, але тоді, коли він намагається запустити міграцію, вони не матимуть сенсу, оскільки вони були написані з оригінальною базою даних та кожною послідовною ітерацією на увазі.
Мій розумовий процес: на кожному етапі початкова база даних плюс кожна міграція в послідовності повинна дорівнювати (плюс або мінус даних) базі даних, що створюється при sync force: true
запускається. Це тому, що описи моделей у коді описують структуру бази даних. Тож, можливо, якщо немає таблиці міграції, ми просто запустимо синхронізацію і позначимо всі міграції як виконані, навіть якщо вони не були запущені. Це те, що мені потрібно зробити (як?), Або Sequelize повинен зробити це сам, або я гавкаю неправильне дерево? І якщо я перебуваю в потрібній зоні, то, безумовно, повинен бути хороший спосіб автоматичної генерації більшої частини міграції, враховуючи старі моделі (за допомогою хеш-файлу? Або навіть можна, щоб кожна міграція була прив’язана до фіксації? Я визнаю, що думаю у непереносному всесвіті git) та нових моделях. Він може відрізняти структуру та генерувати команди, необхідні для перетворення бази даних зі старої в нову та назад, і тоді розробник може зайти та зробити будь-які необхідні зміни (видалення / перехід конкретних даних тощо).
Коли я запускаю sequelize binary з --init
командою, вона дає мені порожній каталог міграцій. Коли я запускаю, sequelize --migrate
це робить мені таблицю SequelizeMeta, в якій немає нічого, немає інших таблиць. Очевидно, що ні, тому що цей двійковий не знає, як завантажувати додаток і завантажувати моделі.
Я, мабуть, чогось пропускаю.
TLDR: як я можу налаштувати додаток та його міграцію, щоб можна було оновити різні екземпляри програми, а також абсолютно новий додаток без застарілої стартової бази даних?
sync
, ідея полягає в тому, що міграції "генерують" всю базу даних, тому покладання на скелет сама по собі є проблемою. Наприклад, робочий процес Ruby on Rails використовує Міграцію для всього, і це досить приголомшливо, коли ви звикаєте до нього. Редагувати: І так, я помітив, що це питання досить старе, але, побачивши, що ніколи не було задовільної відповіді, і люди можуть прийти сюди шукати настанови, я подумав, що я повинен зробити свій внесок.