Rollback delle migrazioni con Flyway

1. Introduzione

In questo breve tutorial, esploreremo un paio di modi per eseguire il rollback di una migrazione con Flyway.

2. Simulare il rollback con una migrazione

In questa sezione, eseguiremo il rollback del nostro database utilizzando un file di migrazione standard.

Nei nostri esempi, useremo la versione a riga di comando di Flyway. Tuttavia, i principi fondamentali sono ugualmente applicabili agli altri formati, come l'API principale, il plug-in Maven, ecc.

2.1. Crea migrazione

Per prima cosa, aggiungiamo una nuova tabella di libri al nostro database. Per fare ciò, creeremo un file di migrazione chiamato V1_0__create_book_table.sql :

create table book ( id numeric, title varchar(128), author varchar(256), constraint pk_book primary key (id) );

In secondo luogo, applichiamo la migrazione:

./flyway migrate

2.2. Simula rollback

Quindi, a un certo punto, diciamo che dobbiamo invertire l'ultima migrazione.

Per ripristinare il database prima della creazione della tabella del libro , creiamo una migrazione denominata V2_0__drop_table_book.sql :

drop table book;

Successivamente, applichiamo la migrazione:

./flyway migrate

Infine, possiamo controllare la cronologia di tutte le migrazioni utilizzando:

./flyway info

che ci dà il seguente output:

+-----------+---------+-------------------+------+---------------------+---------+ | Category | Version | Description | Type | Installed On | State | +-----------+---------+-------------------+------+---------------------+---------+ | Versioned | 1.0 | create book table | SQL | 2020-08-29 16:07:43 | Success | | Versioned | 2.0 | drop table book | SQL | 2020-08-29 16:08:15 | Success | +-----------+---------+-------------------+------+---------------------+---------+

Notare che la nostra seconda migrazione è stata eseguita correttamente.

Per quanto riguarda Flyway, il secondo file di migrazione è solo un'altra migrazione standard. Il ripristino effettivo del database alla versione precedente viene eseguito interamente tramite SQL. Ad esempio, nel nostro caso, l'SQL di eliminare la tabella è l'opposto della prima migrazione, che crea la tabella.

Utilizzando questo metodo, l'audit trail non ci mostra che la seconda migrazione è correlata alla prima , poiché hanno numeri di versione diversi. Per ottenere un tale audit trail, dobbiamo utilizzare Flyway Undo.

3. Utilizzo di Flyway Undo

In primo luogo, è importante notare che Flyway Undo è una funzionalità commerciale di Flyway e non è disponibile nella Community Edition. Pertanto, avremo bisogno dell'edizione Pro o dell'edizione Enterprise per utilizzare questa funzione.

3.1. Crea file di migrazione

Per prima cosa, creiamo un file di migrazione chiamato V1_0__create_book_table.sql :

create table book ( id numeric, title varchar(128), author varchar(256), constraint pk_book primary key (id) );

In secondo luogo, creiamo il corrispondente file di annullamento della migrazione U1_0__create_book_table.sql :

drop table book;

Nella nostra migrazione di annullamento, nota come il prefisso del nome del file è "U" rispetto al normale prefisso di migrazione di "V". Inoltre, nei nostri file di annullamento della migrazione, scriviamo l'SQL che inverte le modifiche del file di migrazione corrispondente . Nel nostro caso, stiamo eliminando la tabella creata dalla normale migrazione.

3.2. Applica migrazioni

Successivamente, controlliamo lo stato corrente delle migrazioni:

./flyway -pro info

Questo ci dà il seguente output:

+-----------+---------+-------------------+------+--------------+---------+----------+ | Category | Version | Description | Type | Installed On | State | Undoable | +-----------+---------+-------------------+------+--------------+---------+----------+ | Versioned | 1.0 | create book table | SQL | | Pending | Yes | +-----------+---------+-------------------+------+--------------+---------+----------+ 

Nota l'ultima colonna, Undoable , che indica che Flyway ha rilevato un file di annullamento della migrazione che accompagna il nostro normale file di migrazione.

Successivamente, applichiamo le nostre migrazioni:

./flyway migrate

Al termine, le nostre migrazioni sono complete e il nostro schema ha una nuova tabella del libro:

 List of relations Schema | Name | Type | Owner --------+-----------------------+-------+---------- public | book | table | baeldung public | flyway_schema_history | table | baeldung (2 rows) 

3.3. Ripristina l'ultima migrazione

Infine, annulliamo l'ultima migrazione utilizzando la riga di comando:

./flyway -pro undo

Dopo che il comando è stato eseguito correttamente, possiamo controllare di nuovo lo stato delle migrazioni:

./flyway -pro info

che ci dà il seguente output:

+-----------+---------+-------------------+----------+---------------------+---------+----------+ | Category | Version | Description | Type | Installed On | State | Undoable | +-----------+---------+-------------------+----------+---------------------+---------+----------+ | Versioned | 1.0 | create book table | SQL | 2020-08-22 15:48:00 | Undone | | | Undo | 1.0 | create book table | UNDO_SQL | 2020-08-22 15:49:47 | Success | | | Versioned | 1.0 | create book table | SQL | | Pending | Yes | +-----------+---------+-------------------+----------+---------------------+---------+----------+

Notare come l'annullamento ha avuto successo e la prima migrazione è tornata in sospeso. Inoltre, a differenza del primo metodo, l' audit trail mostra chiaramente le migrazioni di cui è stato eseguito il rollback.

Sebbene Flyway Undo possa essere utile, presuppone che l'intera migrazione sia riuscita. Ad esempio, potrebbe non funzionare come previsto se una migrazione non riesce a metà.

4. Conclusione

In questo breve tutorial, abbiamo esaminato il ripristino del nostro database utilizzando una migrazione standard. Abbiamo anche esaminato il modo ufficiale di ripristinare le migrazioni utilizzando Flyway Undo. Come al solito, tutto il nostro codice relativo a questo tutorial può essere trovato su GitHub.