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.Odpowiedzi:
Generowanie „pierwszej migracji”
W twoim przypadku najbardziej niezawodnym sposobem jest zrobienie tego prawie ręcznie. Sugerowałbym użycie narzędzia sequelize-cli . Składnia jest raczej prosta:
Spowoduje to utworzenie modelu ORAZ migracji. Następnie ręcznie połącz istniejące modele z wygenerowanymi za pomocą sequelize-cli i zrób to samo z migracjami. Po wykonaniu tej czynności wyczyść bazę danych (jeśli to możliwe) i uruchom
Spowoduje to utworzenie schematu migracji. Powinieneś to zrobić tylko raz, aby przejść do właściwego procesu tworzenia schematu (bez sync: force, ale z autorytatywnymi migracjami).
Później, gdy trzeba zmienić schemat:
sequelize migration:create
sequelize db:migrate
Uruchamianie migracji na produkcji
Oczywiście nie możesz ssh na serwer produkcyjny i przeprowadzać migracji ręcznie. Użyj umzug , agnostycznego narzędzia migracji dla Node.JS, aby wykonać oczekujące migracje przed uruchomieniem aplikacji.
Możesz uzyskać listę oczekujących / jeszcze niewykonanych migracji, na przykład:
Następnie wykonaj migracje ( wewnątrz wywołania zwrotnego ). Metoda execute to funkcja ogólnego przeznaczenia, która dla każdej określonej migracji uruchamia odpowiednią funkcję:
Moja sugestia jest taka, aby zrobić to przed uruchomieniem aplikacji i za każdym razem próbuje obsługiwać trasy. Coś takiego:
Nie mogę tego teraz wypróbować, ale na pierwszy rzut oka powinno działać.
UPD kwiecień 2016 r
Po roku nadal przydatny, więc dzielę się moimi aktualnymi wskazówkami. Na razie instaluję
sequelize-cli
pakiet zgodnie z wymaganiami zależności na żywo , a następnie modyfikuję skrypty startowe NPM wpackage.json
następujący sposób:Jedyne co muszę zrobić na serwerze produkcyjnym to
npm start
. To polecenie uruchomi wszystkie migracje, zastosuje wszystkie seedery i uruchomi serwer aplikacji. Nie ma potrzeby ręcznego dzwonienia do umzug.źródło
pending
a potemexecute
po prostu zrobićumzug.up().then(function (migrations) { app.listen(3000); })
. Zgodnie z dokumentacją umzug, spowoduje to wykonanie wszystkich oczekujących migracji.Sam się tego uczyłem, ale myślę, że poleciłbym teraz korzystanie z migracji, abyś się do nich przyzwyczaił. Odkryłem, że najlepszą rzeczą do ustalenia, co dzieje się podczas migracji, jest przyjrzenie się sql w tabelach utworzonych przez,
sequelize.sync()
a następnie zbudowanie z niego migracji.Utworzy plik migracji szablonu w katalogu migracji. Następnie możesz wypełnić go polami, które chcesz utworzyć. Ten plik będzie musiał zawierać
createdAt
/updatedAt
, pola potrzebne do skojarzeń itp.Do początkowego tworzenia tabeli dół powinien mieć:
Ale kolejne aktualizacje struktury tabeli mogą to pominąć i po prostu użyć alter table.
Przykładowa kreacja wyglądałaby następująco:
Aby powtórzyć od początku:
Używam kawy do uruchomienia pliku zarodkowego do zapełnienia tabel po:
To po prostu zawiera funkcję tworzenia, która wygląda mniej więcej tak:
Pamiętaj, aby
sync()
usunąć indeks w swoich modelach lub nadpisze to, co robią migracje i seed.Oczywiście dokumenty są dostępne pod adresem http://sequelize.readthedocs.org/en/latest/docs/migrations/ . Ale podstawowa odpowiedź brzmi: musisz dodać wszystko w sobie, aby określić potrzebne pola. Nie robi tego za Ciebie.
źródło
sequelize.sync()
mieć wygenerowanego skryptu, który tworzy wszystkie podstawowe tabele i indeksy podczas pierwszej migracji (podobnie jak w przypadku railsówschema.rb
). Po przeczytaniu tego wydaje się, że najlepszym rozwiązaniem może być wyeksportowanie początkowego schematu jako sql, a następnie umieść go w dużejexec
instrukcji podczas pierwszej migracji. Następnie wykonujesz przyrostowe zmiany względem znanego punktu początkowego „wersji 1.0”.Na potrzeby programowania istnieje teraz opcja synchronizacji bieżących tabel poprzez zmianę ich struktury. Korzystając z najnowszej wersji z repozytorium sequelize github , możesz teraz uruchomić synchronizację z
alter
parametrem.Ostrzeżenie z dokumentacji:
źródło
Teraz z nową sekwencją migracja jest bardzo prosta.
To jest przykład tego, co możesz zrobić.
Pamiętaj, że musisz ustawić:
"dialectOptions": { "multipleStatements": true }
w konfiguracji bazy danych.
źródło
Użyj wersji. Wersja aplikacji zależy od wersji bazy danych. Jeśli nowa wersja wymaga aktualizacji bazy danych, utwórz dla niej migrację.
aktualizacja: zdecydowałem się porzucić migrację ( KISS ) i uruchomić skrypt update_db (sync forse: false), gdy jest to potrzebne.
źródło
sync()
i że muszę ręcznie zapisać migracje ze schematu modeli starszej wersji do modeli nowszej wersji?Trochę późno i po przeczytaniu dokumentacji nie musisz mieć tej pierwszej migracji, o której mówisz. Wystarczy zadzwonić
sync
, aby stworzyć stoliki.sequelize.sync()
Możesz również uruchomić prostą synchronizację modelu, wykonując coś takiego:
Project.sync()
ale myślę, żesequelize.sync()
jest to bardziej użyteczny przypadek ogólny dla twojego projektu (o ile importujesz dobre modele w momencie rozpoczęcia).(pobrane z http://sequelizejs.com/docs/latest/models#database-synchronization )
Spowoduje to utworzenie wszystkich początkowych struktur. Później będziesz musiał tylko tworzyć migracje, aby rozwijać swoje schematy.
mam nadzieję, że to pomoże.
źródło
sequelize.sync()
co on robi.Sequelize może asynchronicznie uruchamiać dowolny kod SQL .
Co bym zrobił to:
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');
To powinno zająć się konfiguracją bazy danych, chociaż asynchronizacja może stać się problemem. Gdyby tak się stało,
up
szukałbym sposobu na odroczenie zwracania funkcji sequelize do momentu zakończeniaquery
funkcji async .Więcej o mysql_dump: http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html
Więcej o Sequelize Migrations: http://sequelize.readthedocs.org/en/latest/docs/migrations/
Więcej informacji Uruchamianie SQL z poziomu migracji Sequelize: https://github.com/sequelize/sequelize/issues/313
źródło
Oto mój obecny przepływ pracy. Jestem otwarty na sugestie.
W ten sposób nie musisz ręcznie aktualizować tabeli migracji i martwić się o grube palce, ale nadal masz ORM.
źródło
Znajomy miałem to samo pytanie i udało mi się zrozumieć, jak z nich korzystać.
Zacząłem bez sequelize ORM, więc miałem już model danych.
Musiałem wygenerować modele automatycznie za pomocą sequelize-auto i wygenerować ich migracje za pomocą tego pliku, który tworzysz https://gist.github.com/ahelord/a7a7d293695b71aadf04157f0f7dee64 i zsynchronizować (
{Force: false}
)To jest w dev. model i migracje i wykonuję je za każdym razem, gdy ściągam kod.
W wersji produkcyjnej serwer znajduje się tylko na piętrze, więc musisz tylko uruchamiać migracje i zarządzać każdym zatwierdzeniem, ponieważ będziesz wersjonować model bez zatrzymywania zaplecza
źródło
Przejrzałem ten post i podobne pytania, ale tak naprawdę nie odpowiedziałem. Migracje są przydatne do uruchamiania lokalnych baz danych i aktualizowania danych w środowisku produkcyjnym
Zadałem tutaj pytanie i również na nie odpowiedziałem: Przepływ pracy dla obsługi migracji sequelize i inicjalizacji?
Wersja TL-DR dla projektu greenfield
.sql
pliksequelize init:migrate
w dowolnym folderze, w którym sięmodels
znajdujeszsequelize migration:generate --name [name_of_your_migration]
z tą ogólną strukturą folderów
sequelize migration:generate --name [name_of_your_migration]
up
idown
. To są twoje instrukcje ALTER do zmiany nazw kolumn, DELETE, ADD kolumny itpsequelize 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
które można znaleźć pod adresem https://github.com/sequelize/sequelize-autoMożesz użyć git, aby zobaczyć różnice w swoim modelu, powinny być tylko zmiany odzwierciedlające zmiany w modelu bazy danych. Na marginesie, nigdy nie modyfikuj
models
bezpośrednio, jeśli używaszsequelize auto
, ponieważ wygeneruje to je dla Ciebie. Podobnie, nie powinieneś już modyfikować schematu bazy danych bezpośrednio za pomocą plików SQL, zakładając, że jest to opcja, ponieważ możesz je importować.sql
plikiTeraz schemat Twojej bazy danych jest aktualny i oficjalnie przeniosłeś się na sekwencjonowanie tylko migracji bazy danych.
Wszystko podlega kontroli wersji. Jest to idealny przepływ pracy dla programistów baz danych i zaplecza
źródło
Jest jeszcze prostszy sposób (unikanie Sequalize). Co wygląda tak:
Wpisujesz polecenie wewnątrz projektu: npm run migrate: new
Tworzy to 3 pliki. Plik js i dwa pliki sql o nazwach w górę iw dół
Aby to zadziałało, spójrz na moduł db-migrate .
Po skonfigurowaniu (co nie jest trudne), zmiana bazy danych jest naprawdę łatwa i oszczędza dużo czasu.
źródło