goose pour Go : guide complet avec exemples
Qu'est-ce que goose et pourquoi l'utiliser ?
La bibliothèque goose (Go Object-Oriented SQL Environment) est un outil puissant pour gérer les migrations de bases de données dans l'écosystème Go. Contrairement aux solutions intégrées, goose propose une approche déclarative pour le versionnage du schéma de base de données, permettant aux développeurs de décrire les modifications en SQL ou en code Go. L'objectif principal de goose est d'automatiser l'application et l'annulation des changements de structure de base de données, ce qui est essentiel pour le développement en équipe et les pipelines CI/CD.
Pourquoi utiliser goose ? Premièrement, elle résout le problème de synchronisation du schéma de base de données entre les développeurs : chaque membre de l'équipe peut appliquer les dernières migrations en une seule commande. Deuxièmement, goose prend en charge le versionnage — chaque migration possède un numéro unique, permettant de savoir exactement quelles modifications ont été appliquées. Troisièmement, la bibliothèque fonctionne avec différents SGBD (PostgreSQL, MySQL, SQLite, ClickHouse, etc.) via une interface unifiée, ce qui simplifie le changement d'environnement.
L'avantage clé de goose par rapport à ses concurrents (comme golang-migrate/migrate) est la prise en charge des migrations en Go, et pas seulement en SQL. Vous pouvez écrire des migrations complexes avec de la logique métier, utiliser des transactions et appeler des API externes. De plus, goose offre un support intégré pour embed (intégration des migrations dans le binaire), ce qui est idéal pour les environnements de production.
Installation
L'installation de goose se fait via le gestionnaire de paquets standard de Go. Assurez-vous d'avoir Go version 1.18 ou supérieure.
go install github.com/pressly/goose/v3/cmd/goose@latest
Après l'installation, vérifiez la version :
goose --version
Pour utiliser goose comme bibliothèque dans votre projet, ajoutez la dépendance :
go get github.com/pressly/goose/v3
Vous aurez également besoin d'un pilote pour votre SGBD. Par exemple, pour PostgreSQL :
go get github.com/lib/pq
Pour MySQL :
go get github.com/go-sql-driver/mysql
Pour SQLite :
go get github.com/mattn/go-sqlite3
Démarrage rapide — exemple minimal fonctionnel
Créons un projet simple pour illustrer les fonctionnalités de base de goose.
1. Créez un répertoire pour le projet et initialisez le module :
mkdir goose-demo && cd goose-demo
go mod init goose-demo
2. Créez un répertoire pour les migrations :
mkdir migrations
3. Créez une première migration en SQL. Fichier migrations/001_create_users.sql :
-- +goose Up
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
-- +goose Down
DROP TABLE users;
4. Créez un fichier main.go pour exécuter les migrations par programmation :
package main
import (
"database/sql"
"embed"
"log"
"github.com/pressly/goose/v3"
_ "github.com/lib/pq"
)
//go:embed migrations/*.sql
var migrations embed.FS
func main() {
// Connexion à la base de données
db, err := sql.Open("postgres", "host=localhost port=5432 user=postgres password=postgres dbname=testdb sslmode=disable")
if err != nil {
log.Fatal(err)
}
defer db.Close()
// Définit la source des migrations à partir de embed.FS
goose.SetBaseFS(migrations)
// Exécute les migrations jusqu'à la dernière version
if err := goose.Up(db, "migrations"); err != nil {
log.Fa