Il database versioning è una pratica di gestione delle versioni delle strutture e dei dati di un database in modo simile alla gestione del codice sorgente in un sistema di controllo delle versioni (VCS).
Questa pratica è fondamentale per mantenere la coerenza, la tracciabilità e la riproducibilità delle modifiche apportate al database nel tempo, soprattutto in ambienti di sviluppo software complessi dove più sviluppatori lavorano in modo distribuito e collaborativo e dove il database è un componente critico del sistema.
Obiettivi principali
Il database versioning è una pratica di gestione delle versioni delle strutture e dei dati di un database in modo simile alla gestione del codice sorgente in un sistema di controllo delle versioni (VCS).
Questa pratica è fondamentale per mantenere la coerenza, la tracciabilità e la riproducibilità delle modifiche apportate al database nel tempo, soprattutto in ambienti di sviluppo software complessi dove più sviluppatori lavorano in modo distribuito e collaborativo e dove il database è un componente critico del sistema.
Obiettivi principali
Per migliorare la sicurezza quando si utilizzano strumenti di Database Migration senza concedere privilegi di livello DBA agli utenti delle applicazioni, si possono adottare diverse strategie.
Implementando queste strategie, è possibile ridurre significativamente il rischio associato alla concessione di privilegi elevati agli utenti delle applicazioni durante le migrazioni del database, mantenendo al contempo un flusso di lavoro efficiente per la gestione delle migrazioni stesse.
-- Versione 1.0.0
CREATE TABLE users (
id INT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL
);
-- Versione 1.1.0
ALTER TABLE users ADD COLUMN last_login TIMESTAMP;
Per eseguire la migrazione è sufficiente eseguire il comando flyway migrate
nella directory contenente gli script di migrazione.
Brevemente vedremo com’è strutturato un classico progetto di migrazione del database usando Flyway e come gestire le migrazioni attraverso la CLI (Command Line Interface) messa a disposizione. La versione di riferimento è la OSS Edition v10.13.0
Un progetto standard (standalone) in genere include: script di migrazione, configurazione di Flyway e uno script di esecuzione (quest’ultimo opzionale e costruito sulla base delle proprie esigenze).
# V: Indica che si tratta di una migrazione versionata. È un prefisso obbligatorio.
# <Version>: Numero di versione della migrazione. Può essere un numero intero (es. 1, 2, 3) o semantic version. Le versioni devono seguire un ordine naturale per Flyway.
# __: Doppio underscore come separatore tra il numero di versione e la descrizione. È obbligatorio.
# <Description>: Descrizione della migrazione. Deve essere una stringa descrittiva senza spazi (può usare underscore
# _ o trattini - per separare le parole). La descrizione è facoltativa ma consigliata per rendere il file di migrazione leggibile e comprensibile.
├── flyway.toml
├── migrate.sh
└── sql
├── V1.0.0__create_users_table.sql
├── V1.1.0__add_email_to_users.sql
├── V2.0.0__create_orders_table.sql
└── V2.0.1__add_foreign_key_to_orders.sql
Configurazione di Flyway tramite il file di properties flayway.toml
ed esecuzione della migrazione attraverso lo script shell migrate.sh
# More information on the parameters can be found
# here: https://documentation.red-gate.com/flyway/flyway-cli-and-api/configuration/parameters
[environments.default]
url = "jdbc:postgresql://localhost:5432/migration_db"
user = "migration_user"
password = "migration_password"
[flyway]
locations = ["filesystem:sql"]
Il file di configurazione è in formato TOML - Tom’s Obvious, Minimal Language e sostituisce il formato tradizionale (legacy) conf (properties format). Per maggiori consultare la guida TOML Configuration.
#!/usr/bin/env bash
# Assicurati che Flyway sia installato e che il comando `flyway` sia disponibile nel PATH
# Puoi installare Flyway seguendo le istruzioni
# qui: https://documentation.red-gate.com/fd/command-line-184127404.html
# Esegui la migrazione
flyway migrate
# Visualizza lo stato delle migrazioni
flyway info
Il comando di migrazione di Flyway (flyway migrate
) è uno degli strumenti principali utilizzati per applicare le modifiche al database, mentre il comando flyway info
visualizza le informazioni circa lo stato delle migrazioni.
Nelle successive slide vedremo una spiegazione breve e dettagliata di come funziona il processo di migrazione, che in genere i vari tool gestiscono alla stesso modo.
Sotto il cofano, l’esecuzione del comando flyway migrate
esegue le seguenti attività.
flyway.toml
, flyway.conf
o dalle variabili d’ambiente. Queste configurazioni includono le informazioni di connessione al database, la posizione degli script di migrazione, e altre impostazioni.flyway_schema_history
) nel database. Questa tabella tiene traccia delle migrazioni che sono state già applicate al database.Quelli a seguire sono gli script SQL di migrazione che rappresentano rispettivamente le versioni del database: 1.0.0, 1.1.0, 2.0.0 e 2.0.1.
-- Code 1 - Script di migrazione V1.0.0__create_users_table.sql
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) NOT NULL
);
-- Code 2 - Script di migrazione V1.1.0__add_email_to_users.sql
ALTER TABLE users ADD COLUMN email VARCHAR(100);
-- Code 3 - Script di migrazione V2.0.0__create_orders_table.sql
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
user_id INT NOT NULL,
order_date TIMESTAMP NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id)
);
-- Code 4 - Script di migrazione V2.0.1__add_foreign_key_to_orders.sql
ALTER TABLE orders ADD CONSTRAINT fk_user
FOREIGN KEY (user_id) REFERENCES users(id);
Prima di eseguire il processo di migrazione, proviamo a vedere lo stato attuale del database eseguendo il comando flyway info
.
Flyway OSS Edition 10.13.0 by Redgate
See release notes here: https://rd.gt/416ObMi
Database: jdbc:postgresql://localhost:5432/migration_db (PostgreSQL 16.3)
Schema history table "public"."flyway_schema_history" does not exist yet
Schema version: << Empty Schema >>
+-----------+---------+---------------------------+------+--------------+---------+----------+
| Category | Version | Description | Type | Installed On | State | Undoable |
+-----------+---------+---------------------------+------+--------------+---------+----------+
| Versioned | 1.0.0 | create users table | SQL | | Pending | No |
| Versioned | 1.1.0 | add email to users | SQL | | Pending | No |
| Versioned | 2.0.0 | create orders table | SQL | | Pending | No |
| Versioned | 2.0.1 | add foreign key to orders | SQL | | Pending | No |
+-----------+---------+---------------------------+------+--------------+---------+----------+
L’output mostrato è quello atteso, dato che il database è praticamente "nuovo", ovvero, non ha ancora subito nessun processo di migrazione.
A seguire un video che mostra l’esecuzione di una serie di migrazioni partendo da zero. Il video è accelerato 3 volte per questioni di tempo. Qui https://asciinema.org/a/660361 puoi trovare il video completo.
Riepilogo dei punti chiave
Importanza della disciplina nel versioning
Prossimi passi per implementare il database versioning
Grazie per l’attenzione! Se avete domande, sono qui per rispondere.