Sono vicino ad avere il mio progetto pronto per il lancio. Ho grandi progetti per il dopo lancio e la struttura del database cambierà: nuove colonne nelle tabelle esistenti, nonché nuove tabelle e nuove associazioni a modelli esistenti e nuovi.
Non ho ancora toccato le migrazioni in Sequelize, dal momento che ho avuto solo dati di test che non mi dispiace cancellare ogni volta che il database cambia.
A tal fine, al momento sono in esecuzione sync force: true
all'avvio della mia app, se ho modificato le definizioni del modello. Questo elimina tutti i tavoli e li rende da zero. Potrei omettere l' force
opzione per farlo solo creare nuove tabelle. Ma se quelli esistenti sono cambiati, questo non è utile.
Quindi, una volta aggiunto nelle migrazioni, come funzionano le cose? Ovviamente non voglio che le tabelle esistenti (con dati al loro interno) vengano cancellate, quindi sync force: true
è fuori discussione. Su altre app che ho aiutato a sviluppare (Laravel e altri framework) come parte della procedura di distribuzione dell'app, eseguiamo il comando migrate per eseguire eventuali migrazioni in sospeso. Ma in queste app la prima migrazione ha un database scheletro, con il database nello stato in cui era un po 'di tempo all'inizio dello sviluppo: la prima versione alpha o altro. Quindi anche un'istanza dell'app in ritardo alla festa può essere aggiornata in una sola volta, eseguendo tutte le migrazioni in sequenza.
Come posso generare una "prima migrazione" in Sequelize? Se non ne ho uno, una nuova istanza dell'app in qualche modo lungo la linea non avrà un database scheletro su cui eseguire le migrazioni o eseguirà la sincronizzazione all'inizio e renderà il database nel nuovo stato con tutti le nuove tabelle ecc., ma quando tentano di eseguire le migrazioni non avranno senso, dal momento che sono state scritte con il database originale e ogni successiva iterazione in mente.
Il mio processo di pensiero: in ogni fase, il database iniziale più ogni migrazione in sequenza dovrebbe essere uguale (più o meno dati) al database generato quando sync force: true
è eseguito. Questo perché le descrizioni dei modelli nel codice descrivono la struttura del database. Quindi, forse, se non esiste una tabella di migrazione, eseguiamo solo la sincronizzazione e contrassegniamo tutte le migrazioni come completate, anche se non sono state eseguite. È questo ciò che devo fare (come?) O Sequelize dovrebbe farlo da solo, o sto abbaiando sull'albero sbagliato? E se sono nella giusta area, sicuramente dovrebbe esserci un bel modo per generare automaticamente la maggior parte di una migrazione, dati i vecchi modelli (con hash di commit? O anche ogni migrazione potrebbe essere legata a un commit? Ammetto che sto pensando in un universo git-centrico non portatile) e i nuovi modelli. Può differenziare la struttura e generare i comandi necessari per trasformare il database da vecchio a nuovo e viceversa, quindi lo sviluppatore può accedere e apportare tutte le modifiche necessarie (eliminazione / transizione di dati particolari ecc.).
Quando eseguo il binario sequelize con il --init
comando mi dà una directory di migrazioni vuota. Quando sequelize --migrate
lo eseguo, mi viene in mente una tabella SequelizeMeta che non contiene nulla, né altre tabelle. Ovviamente no, perché quel binario non sa come avviare la mia app e caricare i modelli.
Mi manca qualcosa.
TLDR: come si configura la mia app e le sue migrazioni in modo da poter aggiornare varie istanze dell'app live, nonché una nuovissima app senza database di avvio legacy?
sync
per ora, l'idea è che le migrazioni "generano" l'intero database, quindi fare affidamento su uno scheletro è di per sé un problema. Il flusso di lavoro di Ruby on Rails, ad esempio, utilizza le migrazioni per tutto ed è abbastanza fantastico una volta che ti ci abitui. Modifica: E sì, ho notato che questa domanda è piuttosto vecchia, ma visto che non c'è mai stata una risposta soddisfacente e le persone possono venire qui in cerca di guida, ho pensato che avrei dovuto contribuire.