Migrations de bases de données en Go : aperçu des outils et pratiques

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 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/v4


Structure 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.sql

Exemple :

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


Exemple 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 1


2. 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/v3


Structure 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.sql


Exemple de migr

Recommendations