Migrations de base de données en Go (Golang) : guide complet des outils

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Migrations de base de données en Go (Golang) : comment gérer le schéma de données

\n\n

Lors 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\n

Dans 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.

\n\n

Que sont les migrations et pourquoi en a-t-on besoin ?

\n\n

Une 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\n

Les 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
\n\n

1. golang-migrate/migrate

\n\n

La 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\n

Installation

\n
go get -u github.com/golang-migrate/migrate/v4\ngo install -tags 'postgres' github.com/golang-migrate/migrate/v4/cmd/migrate@latest
\n\n

Structure des migrations

\n

Créez un dossier migrations et ajoutez des fichiers avec un préfixe au format {timestamp}_{title}.{direction}.sql :

\n
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\n

Exemple 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\n

Exemple de migration (down)

\n
-- 000001_create_users_table.down.sql\nDROP TABLE IF EXISTS users;
\n\n

Application des migrations depuis le code Go

\n
package 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\n

2. pressly/goose

\n\n

Goose 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\n

Installation

\n
go get github.com/pressly/goose/v3/cmd/goose
\n\n

Création d'une migration

\n
goose create create_users_table sql
\n\n

Un fichier du type 20250101120000_create_users_table.sql sera créé. Contenu :

\n
-- +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\n

Migrations en Go (variante avancée)

\n

Goose permet d'écrire des migrat

Recommendations