Jestem bliski ukończenia mojego projektu do uruchomienia. Mam duże plany po uruchomieniu, a struktura bazy danych ulegnie zmianie - nowe kolumny w istniejących tabelach, nowe tabele, nowe skojarzenia z istniejącymi i nowymi modelami.
Nie poruszyłem jeszcze migracji w Sequelize, ponieważ miałem tylko dane testowe, których nie mam nic przeciwko usuwaniu za każdym razem, gdy zmienia się baza danych.
W tym celu obecnie uruchamiam się, sync force: true
gdy moja aplikacja się uruchamia, jeśli zmieniłem definicje modelu. Spowoduje to usunięcie wszystkich tabel i utworzenie ich od podstaw. Mógłbym pominąć force
opcję, aby tworzyć tylko nowe tabele. Ale jeśli istniejące uległy zmianie, nie jest to przydatne.
Więc kiedy dodam migracje, jak to działa? Oczywiście nie chcę, aby istniejące tabele (z danymi) zostały usunięte, więc nie sync force: true
ma mowy. W innych aplikacjach, które pomogłem opracować (Laravel i inne frameworki) w ramach procedury wdrażania aplikacji, uruchamiamy polecenie migrate, aby uruchomić wszelkie oczekujące migracje. Ale w tych aplikacjach pierwsza migracja ma szkieletową bazę danych, z bazą danych w stanie, w którym była na wczesnym etapie rozwoju - pierwsza wersja alfa lub cokolwiek innego. Dzięki temu nawet instancja aplikacji spóźniona na imprezę może przyspieszyć za jednym zamachem, wykonując wszystkie migracje po kolei.
Jak wygenerować taką „pierwszą migrację” w Sequelize? Jeśli go nie mam, nowe wystąpienie aplikacji w pewnym stopniu nie będzie miało szkieletowej bazy danych do uruchomienia migracji lub uruchomi synchronizację na początku i spowoduje, że baza danych będzie w nowym stanie ze wszystkimi nowe tabele itp., ale wtedy, gdy próbuje uruchomić migracje, nie mają one sensu, ponieważ zostały napisane z myślą o oryginalnej bazie danych i każdej kolejnej iteracji.
Mój proces myślowy: na każdym etapie początkowa baza danych plus każda migracja w kolejności powinny odpowiadać (plus lub minus dane) bazie danych wygenerowanej, gdy sync force: true
prowadzony jest. Dzieje się tak, ponieważ opisy modeli w kodzie opisują strukturę bazy danych. Więc może jeśli nie ma tabeli migracji, po prostu uruchamiamy synchronizację i oznaczamy wszystkie migracje jako wykonane, nawet jeśli nie zostały uruchomione. Czy to jest to, co muszę zrobić (jak?), Czy też Sequelize ma to zrobić samodzielnie, czy też szczekam na niewłaściwe drzewo? A jeśli jestem we właściwym obszarze, z pewnością powinien istnieć dobry sposób na automatyczne generowanie większości migracji, biorąc pod uwagę stare modele (przez skrót zatwierdzenia? Lub nawet czy każda migracja może być powiązana z zatwierdzeniem? w nieprzenośnym uniwersum git-centric) i nowe modele. 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 wprowadzić wszelkie niezbędne poprawki (usuwanie / przenoszenie określonych danych itp.).
Kiedy uruchamiam plik binarny sequelize za pomocą --init
polecenia, wyświetla mi się pusty katalog migracji. Kiedy następnie uruchamiam sequelize --migrate
, staje się tabelą SequelizeMeta bez żadnych innych tabel. Oczywiście, że nie, ponieważ ten plik binarny nie wie, jak załadować moją aplikację i wczytać modele.
Muszę czegoś przegapić.
TLDR: jak skonfigurować moją aplikację i jej migracje, aby można było zaktualizować różne wystąpienia aplikacji na żywo, a także zupełnie nową aplikację bez starszej początkowej bazy danych?
sync
teraz, idea jest taka, że migracje „generują” całą bazę danych, więc poleganie na szkielecie jest samo w sobie problemem. Na przykład obieg pracy w Ruby on Rails wykorzystuje migracje do wszystkiego i jest całkiem niesamowity, gdy się do tego przyzwyczaisz. Edycja: I tak, zauważyłem, że to pytanie jest dość stare, ale ponieważ nigdy nie było satysfakcjonującej odpowiedzi i ludzie mogą tu przychodzić w poszukiwaniu wskazówek, pomyślałem, że powinienem wnieść swój wkład.