Sequelize.js: jak korzystać z migracji i synchronizacji

Jestem bliski przygotowania mojego projektu do uruchomienia. Mam duże plany po uruchomieniu i struktura bazy danych zmieni się - nowe kolumny w istniejących tabelach, a także nowe tabele i nowe skojarzenia z istniejącymi i nowymi modelami.

Jeszcze nie dotknąłem migracji w Sequelize, ponieważ miałem tylko dane testowe, których nie mam nic przeciwko wycinaniu przy każdej zmianie bazy danych.

W tym celu obecnie biegamsync force: true kiedy moja aplikacja zostanie uruchomiona, jeśli zmienię definicje modelu. To usuwa wszystkie tabele i czyni je od zera. Mogłem pominąćforce opcja, aby utworzyć tylko nowe tabele. Ale jeśli istniejące już się zmieniły, nie jest to przydatne.

Więc kiedy dodam migracje, jak to działa? Oczywiście nie chcę, aby istniejące tabele (z danymi w nich) zostały wymazanesync force: true nie wchodzi w rachubę. W innych aplikacjach, które pomogłem opracować (Laravel i inne frameworki) w ramach procedury wdrażania aplikacji uruchamiamy komendę migrate, aby uruchomić wszystkie oczekujące migracje. Ale w tych aplikacjach pierwsza migracja ma szkieletową bazę danych, z bazą danych w stanie, w którym było to trochę wcześniej - pierwsza wersja alfa lub cokolwiek innego. Więc nawet instancja aplikacji spóźniona na imprezę może przyspieszyć za jednym razem, uruchamiając wszystkie migracje w sekwencji.

Jak wygenerować taką „pierwszą migrację” w Sequelize? Jeśli go nie mam, nowa instancja aplikacji w dół linii nie będzie miała żadnej bazy danych szkieletowych do uruchomienia migracji lub uruchomi synchronizację na początku i sprawi, że baza danych będzie w nowym stanie ze wszystkimi nowe tabele itp., ale kiedy próbują uruchomić migracje, nie będą miały sensu, ponieważ zostały zapisane z oryginalną bazą danych i każdą kolejną iteracją.

Mój proces myślowy: na każdym etapie początkowa baza danych plus każda migracja w sekwencji powinny być równe (plus lub minus dane) wygenerowanej bazie danychsync force: true prowadzony jest. Dzieje się tak, ponieważ opisy modelu w kodzie opisują strukturę bazy danych. Więc może jeśli nie ma tabeli migracji, po prostu uruchom synchronizację i zaznacz wszystkie migracje jako wykonane, nawet jeśli nie były uruchamiane. Czy to jest to, co muszę zrobić (jak?), Czy też Sequelize ma to zrobić sam, czy też szczeka niewłaściwe drzewo? A jeśli jestem we właściwym obszarze, z pewnością powinien istnieć fajny sposób na automatyczne generowanie większości migracji, biorąc pod uwagę stare modele (poprzez hash zatwierdzania? Lub nawet czy każda migracja była związana z zatwierdzeniem? Zgadzam się, że myślę w nieprzenośnym wszechświecie git-centric) i nowych modelach. Może różnicować strukturę i generować polecenia potrzebne do przekształcenia bazy danych ze starej na nową iz powrotem, a następnie programista może wejść i dokonać niezbędnych poprawek (usunięcie / przejście określonych danych itp.).

Kiedy uruchamiam binarny sequelize za pomocą--init polecenie daje mi pusty katalog migracji. Kiedy ucieknęsequelize --migrate to sprawia, że ​​jestem tabelą SequelizeMeta, w której nie ma nic, żadnych innych tabel. Oczywiście nie, ponieważ ten plik binarny nie wie, jak załadować moją aplikację i załadować modele.

Tęsknię za czymś.

TLDR: jak skonfigurować moją aplikację i jej migracje, aby można było aktualizować różne instancje aplikacji na żywo, a także zupełnie nową aplikację bez początkowej bazy danych?

questionAnswers(10)

yourAnswerToTheQuestion