Migrations de base de données en Go (Golang) : comment gérer le schéma de données
\n\nLors du développement d'applications 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, créer des index. L'exécution manuelle de scripts SQL sur différents environnements (environnement de développement local, staging, production) entraîne des erreurs et une désynchronisation. La solution — les migrations de base de données (database migrations).
\n\nDans l'écosystème Go, il existe plusieurs bibliothèques matures pour gérer les migrations. Dans cet article, nous allons détailler les trois outils les plus populaires : golang-migrate/migrate, pressly/goose et rubenv/sql-migrate. Vous apprendrez comment installer, configurer et utiliser chacun d'eux, et découvrirez les meilleures pratiques.
Que sont les migrations et pourquoi en a-t-on besoin ?
\n\nUne migration est un fichier (ou un ensemble de fichiers) qui contient des commandes SQL pour modifier le schéma de la base de données. Chaque migration possède un identifiant unique (généralement un horodatage ou un numéro) et deux directions : up (application des modifications) et down (annulation des modifications).
\n\nLes principaux avantages de l'utilisation des migrations :
\n- \n
- Versionnement du schéma — l'historique des modifications est stocké dans le dépôt avec le code. \n
- Reproductibilité — des modifications identiques sur tous les environnements. \n
- Annulation des modifications — possibilité de revenir rapidement à une version précédente du schéma. \n
- Travail d'équipe — les développeurs ne se marchent pas sur les modifications. \n
1. golang-migrate/migrate
\n\nLa bibliothèque de migration la plus populaire en Go. Prend en charge PostgreSQL, MySQL, SQLite, MongoDB et de nombreuses autres bases de données.
\n\nInstallation
\ngo get -u github.com/golang-migrate/migrate/v4\ngo install -tags 'postgres' github.com/golang-migrate/migrate/v4/cmd/migrate@latest\n\nStructure des migrations
\nCréez un dossier migrations et ajoutez des fichiers avec un préfixe au format {timestamp}_{title}.{direction}.sql :
migrations/\n 000001_create_users_table.up.sql\n 000001_create_users_table.down.sql\n 000002_add_email_column.up.sql\n 000002_add_email_column.down.sql\n\nExemple de migration (up)
\n-- 000001_create_users_table.up.sql\nCREATE TABLE users (\n id SERIAL PRIMARY KEY,\n name VARCHAR(100) NOT NULL,\n created_at TIMESTAMP DEFAULT NOW()\n);\n\nExemple de migration (down)
\n-- 000001_create_users_table.down.sql\nDROP TABLE IF EXISTS users;\n\nApplication des migrations depuis le code Go
\npackage main\n\nimport (\n "github.com/golang-migrate/migrate/v4"\n _ "github.com/golang-migrate/migrate/v4/database/postgres"\n _ "github.com/golang-migrate/migrate/v4/source/file"\n)\n\nfunc main() {\n m, err := migrate.New(\n "file://migrations",\n "postgres://localhost:5432/mydb?sslmode=disable")\n if err != nil {\n panic(err)\n }\n if err := m.Up(); err != nil && err != migrate.ErrNoChange {\n panic(err)\n }\n}\n\n2. pressly/goose
\n\nGoose est un outil léger et rapide qui prend également en charge l'écriture de migrations en Go (pas seulement en SQL). Idéal pour les projets nécessitant une logique côté code.
\n\nInstallation
\ngo get github.com/pressly/goose/v3/cmd/goose\n\nCréation d'une migration
\ngoose create create_users_table sql\n\nUn fichier du type 20250101120000_create_users_table.sql sera créé. Contenu :
-- +goose Up\nCREATE TABLE users (\n id SERIAL PRIMARY KEY,\n name VARCHAR(100) NOT NULL\n);\n\n-- +goose Down\nDROP TABLE IF EXISTS users;\n\nMigrations en Go (variante avancée)
\nGoose permet d'écrire des migrat
Aussi dans la bibliothèque
Conteneur d'injection de dépendances pour Java : Spring IoC, Google Guice et Dagger
Parsing HTML en C# (.NET) : aperçu des bibliothèques et exemples de code
Travailler avec S3 et les stockages cloud en Swift (iOS/macOS) : la bibliothèque AWSS3
Guide complet Swagger-PHP pour PHP : tutoriel et exemples
NLog C# (.NET) : guide complet avec exemples pratiques