Migrations de bases de données en Go (Golang) : guide complet
Lors du développement d'applications web en Go, il devient tôt ou tard nécessaire de modifier la structure de la base de données : ajouter de nouvelles tables, modifier des colonnes existantes ou créer des index. L'exécution manuelle de scripts SQL dans différents environnements (développement, staging, production) entraîne des erreurs et une désynchronisation. La solution à ce problème réside dans les migrations de bases de données.
En Go, il existe plusieurs bibliothèques matures pour gérer les migrations. Dans cet article, nous allons détailler les deux plus populaires : golang-migrate/migrate et pressly/goose, et fournir des exemples d'utilisation.
Que sont les migrations et pourquoi en a-t-on besoin ?
Une migration est un ensemble versionné de commandes SQL (ou de code Go) qui est appliqué séquentiellement à la base de données. Chaque migration possède un identifiant unique (généralement un horodatage ou un numéro) et peut être appliquée (up) ou annulée (down).
Principaux avantages :
- Automatisation des modifications du schéma de la base de données
- Reproductibilité — résultat identique dans n'importe quel environnement
- Possibilité d'annuler les modifications
- Stockage de l'historique des modifications dans le code (compatible VCS)
1. Bibliothèque golang-migrate/migrate
C'est la bibliothèque la plus populaire pour les migrations en Go. Elle prend en charge PostgreSQL, MySQL, SQLite, MongoDB et d'autres SGBD. Les migrations peuvent être écrites en SQL pur ou en Go.
Installation
go get -u github.com/golang-migrate/migrate/v4Structure des fichiers de migration
Les fichiers sont placés dans le dossier migrations/ et sont nommés selon le modèle :
{timestamp}_{title}.up.sql{timestamp}_{title}.down.sqlExemple :
migrations/ 000001_create_users_table.up.sql 000001_create_users_table.down.sql 000002_add_email_to_users.up.sql 000002_add_email_to_users.down.sqlExemple de migration SQL
Fichier 000001_create_users_table.up.sql :
CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT NOW());Fichier 000001_create_users_table.down.sql :
DROP TABLE IF EXISTS users;Application des migrations depuis le code Go
package main
import ( "github.com/golang-migrate/migrate/v4" _ "github.com/golang-migrate/migrate/v4/database/postgres" _ "github.com/golang-migrate/migrate/v4/source/file")
func main() { m, err := migrate.New( "file://migrations", "postgres://user:password@localhost:5432/dbname?sslmode=disable", ) if err != nil { panic(err) }
// Appliquer toutes les migrations disponibles (Up) if err := m.Up(); err != nil && err != migrate.ErrNoChange { panic(err) }
// Annuler la dernière migration (Down) // if err := m.Steps(-1); err != nil { // panic(err) // }}Outil CLI migrate
Un utilitaire en ligne de commande est également disponible :
migrate create -ext sql -dir migrations -seq create_users_tablemigrate -path migrations -database "postgres://..." upmigrate -path migrations -database "postgres://..." down 12. Bibliothèque pressly/goose
Goose est un autre outil populaire, initialement créé comme un équivalent des migrations ActiveRecord de Ruby on Rails. Il prend en charge les migrations SQL et Go, ainsi qu'un CLI intégré.
Installation
go get -u github.com/pressly/goose/v3Structure des fichiers
Les fichiers sont nommés comme {timestamp}_{title}.sql (sans séparation up/down — tout dans un seul fichier via des commentaires) :
migrations/ 20240101120000_create_users_table.sql 20240102150000_add_email_to_users.sqlExemple de migr
Aussi dans la bibliothèque
Génération de PDF en Rust : aperçu des bibliothèques et outils pour créer des documents PDF
Autorisation et authentification en Java : guide complet
ORM pour Rust : comparaison et exemples Diesel, SeaORM, SQLx
Bibliothèques GraphQL Kotlin : aperçu complet pour les développeurs backend