Sì, ci stai pensando nel modo sbagliato.
Supponiamo che tu non usi Alembic o qualsiasi altro framework di migrazione. In questo caso si crea un nuovo database per l'applicazione con le seguenti operazioni:
- Scrivi la classi del modello
- creare e configurare un nuovo database di zecca
- Run
db.create_all()
, che esamina i vostri modelli e crea la tabelle corrispondenti nel tuo database.
Quindi ora considerare il caso di un aggiornamento. Ad esempio, supponiamo che tu rilasci la versione 1.0 della tua applicazione e ora inizi a lavorare sulla versione 2.0, che richiede alcune modifiche al tuo database. Come puoi ottenerlo? La limitazione qui è che db.create_all()
non modifica le tabelle, può solo crearle da zero. Così va la vita in questo modo:
- Apportare le modifiche necessarie alle classi del modello
Ora avete due opzioni per trasferire le modifiche al database:
5.1 Destroy il database in modo che è possibile eseguire nuovamente db.create_all()
per ottenere le tabelle aggiornate, magari il backup e il ripristino dei dati in modo da non perderlo. Sfortunatamente SQLAlchemy non aiuta con i dati, dovrai usare strumenti di database per questo.
5.2 Applicare le modifiche manualmente, direttamente al database. Questo è soggetto a errori e sarebbe noioso se il set di modifiche è grande.
Ora considera di avere database di sviluppo e produzione, il che significa che il lavoro deve essere eseguito due volte. Pensa anche a quanto sarebbe noioso quando hai diverse versioni della tua applicazione, ognuna con uno schema di database diverso e devi indagare su un bug in una delle versioni precedenti, per cui è necessario ricreare il database come era in quello pubblicazione.
Vedere qual è il problema quando non si dispone di una rete di migrazione?
Utilizzando Alembic, si ha un po 'di lavoro extra quando si avvia, ma si paga perché semplifica il flusso di lavoro per gli aggiornamenti.La fase di creazione va come questa:
- Scrivi la classi del modello
- creare e configurare un nuovo database di
- Generare un migrazione iniziale Alembic, sia manualmente che automaticamente. Se vai con le migrazioni automatiche, Alembic guarda i tuoi modelli e genera il codice che li applica al database.
- Eseguire il comando
upgrade
, che esegue lo script di migrazione, creando effettivamente le tabelle nel database.
Poi, quando si raggiunge il punto di fare un aggiornamento, effettuare le seguenti operazioni:
- Apportare le modifiche necessarie alle classi del modello
- Generare un'altra migrazione Alembic . Se lasci che Alembic generi questo per te, confronta le tue classi di modelli con lo schema corrente nel tuo database e genera il codice necessario per fare in modo che il database corrisponda ai modelli.
- Eseguire il comando
upgrade
. Questo applica le modifiche al database, senza la necessità di distruggere alcuna tabella o eseguire il backup dei dati. È possibile eseguire questo aggiornamento su tutti i database (produzione, sviluppo, ecc.).
cose importanti da considerare quando si utilizza Alembic:
- Gli script di migrazione diventano parte del codice sorgente, quindi hanno bisogno di essere impegnati a controllo del codice sorgente con i propri file.
- Se si utilizza la generazione di migrazione automatica, è sempre necessario rivedere le migrazioni generate. Alambicco non è sempre in grado di determinare i cambiamenti esatti, quindi è possibile che lo script generato abbia bisogno di una regolazione fine manuale.
- Gli script di migrazione hanno le funzioni
upgrade
e downgrade
. Ciò significa che non solo semplificano gli aggiornamenti, ma anche i downgrade. Se hai bisogno di sincronizzare il database con una vecchia versione, il comando downgrade
lo fa per te senza alcun lavoro aggiuntivo da parte tua!
Grazie mille. Questo mi ha praticamente cancellato tutto. Ho ancora qualche domanda. Con le migrazioni manuali si intende che, dopo aver aggiunto nuove classi ai modelli o modificato le classi esistenti nei modelli, è necessario eseguire una nuova migrazione nell'alambicco utilizzando "alembic revision -m 'tablename'". Quindi nella cartella delle versioni devo modificare (definire) il file .py appena creato per abbinare le classi del modello che ho appena definito? È buona pratica farlo manualmente? –
Giusto. Le migrazioni manuali richiedono di scrivere autonomamente le funzioni 'upgrade' e' downgrade', senza l'aiuto di Alembic. La generazione della migrazione automatica è abbastanza buona, quindi preferisco generare automaticamente uno script, quindi lo rivedo e apporto eventuali correzioni se necessario, ovviamente prima di eseguire l'aggiornamento. – Miguel