By Okure U. Edet

Go est une langue de programmation rapide avec une syntaxe relativement simple. En apprenant Go, il est important d’apprendre comment construire des API et comment les utiliser pour communiquer avec les bases de données. Au cours de l’apprentissage, j’ai décidé de me lancer dans un projet qui m’a aidé à cet égard : une simple API de suivi d’inventaire.

En travaillant avec une base de données SQL comme Postgres, j’ai appris qu’il est important de faire des modifications à la base de données en temps opportun. Ainsi, si vous avez un schéma que vous pourriez modifier à l’avenir, la meilleure façon de le faire est avec les migrations de base de données. Cela garantit que les modifications apportées à la base de données sont effectuées avec précision sans affecter les données existantes.

Dans cet article, vous apprendrez à utiliser les migrations de base de données avec Docker et Postgres.

Table des matières

Qu’est-ce que la migration de base de données ?

Qu’est-ce que la migration de base de données et pourquoi l’utiliser ? Bien, en tant que développeur backend, lorsque vous travailliez sur un projet qui exige que vous stockiez des données dans une base de données, vous devrez développer un schéma pour les données que vous souhaitez stocker.

Les migrations de base de données vous aident à gérer la structure des données dans une base de données, et dans ce cas, une base de données relationnelle. Les migrations aident à modifier les schémas à partir d’un état courant vers un état spécifique/ souhaité. Cela peut impliquer l’ajout de tables et de colonnes, la suppression d’éléments ou le changement des types et des contraintes.

Une importance de la migration de base de données est de faire des changements dans une base de données répétables et sans bogue sans la préoccupation de la perte de données.

Il est conseillé d’utiliser des migrations si vous n’êtes pas sûr de ce que votre schéma de données final ressemblera. Dans ce sens, vous pouvez implémenter des modifications progressivement.

Comment démarrer et exécuter un conteneur Docker

Ouvrez votre terminal et créez un nouveau dossier mkdir tracking-inventory-app.

Ensuite, téléchargez une image de postgres depuis Docker Hub. J’ai utilisé l’étiquette postgres:14-alpine. Vous pouvez utiliser l’étiquette que vous voulez.

Dans votre terminal, collez ce qui suit et appuyez sur Entrée :

$ docker pull postgres:14-alpine

Après l’installation, démarrez le conteneur en utilisant la commande docker run :

$ docker run --name postgres14 -e POSTGRES_USER=root -e POSTGRES_PASSWORD=passwordd -p 5432:5432 -d postgres:14-alpine

Le drapeau --name fait référence au nom du conteneur. Le drapeau -e correspond aux variables d’environnement. Le drapeau -p signifie que vous devez publier. Vous devez exécuter votre conteneur sur un port spécifique. Le drapeau -d signifie que vous souhaitez le démarrer en mode détaché.

Une fois entré, ouvrez votre Docker Desktop si vous l’avez installé. Si ce n’est pas le cas, vous pouvez le télécharger depuis le site web de Docker.

Dans votre Docker Desktop, vous devez voir que le conteneur a été démarré :

Vous pouvez établir une connexion à la base de données à l’aide de TablePlus :

Testez la connexion. Si cela indique « ok », connectez-vous. Si vous êtes sur Windows et qu’il affiche une erreur d’authentification, allez à votre bouton Démarrer et cliquez sur Exécuter. Dans la fenêtre contextuelle, tapez services.msc et appuyez sur Entrée. Recherchez Postgres et cliquez sur le service Stop. Ensuite, essayez de vous connecter à nouveau.

Comment créer et exécuter un schéma à l’aide de TablePlus

J’ai créé un schéma prédéfini/modèle pour le projet tracking-inventory avec db diagram. Ce tracking-inventory devrait vous permettre d’ajouter un article, un numéro de série et une valeur. Donc le schéma aura les champs item, serial_number, id et created_at.

CREATE TABLE "inventory" (
  "id" uuid PRIMARY KEY,
  "item" varchar NOT NULL,
  "serial_number" varchar NOT NULL,
  "user" uuid NOT NULL,
  "created_at" timestamptz NOT NULL DEFAULT 'now()'
);

CREATE TABLE "user" (
  "id" uuid PRIMARY KEY,
  "name" varchar NOT NULL,
  "email" varchar UNIQUE NOT NULL,
  "password" varchar NOT NULL,
  "created_at" timestamptz NOT NULL DEFAULT 'now()'
);

CREATE INDEX ON "inventory" ("item");

ALTER TABLE "inventory" ADD FOREIGN KEY ("user") REFERENCES "user" ("id");

C’est comment le mien est. Vous pouvez ouvrir votre TablePlus et ajouter le code PostgreSQL généré et le exécuter.

Comment installer golang-migrate

La prochaine étape consiste à installer golang-migrate sur votre système. J’utilise Windows avec Linux pour ce tutoriel.

Pour l’installer, consultez cette documentation.

Je suis en train d’utiliser Linux, donc je vais utiliser curl :

$ curl -L https://github.com/golang-migrate/migrate/releases/download/v4.12.2/migrate.linux-amd64.tar.gz | tar xvz

Une fois l’installation réussie, exécutez sur votre terminal la commande migrate -help pour voir ses différentes commandes.

Comment créer une nouvelle migration

Après l’installation de golang-migrate, vous pouvez créer un nouveau script de migration.

Tout d’abord, dans votre terminal et à l’intérieur du répertoire tracking-app, ouvrez VS Code avec la commande code.

Une fois que c’est fait, créez un nouveau dossier nommé db et un autre dossier à l’intérieur du dossier db nommé migrations.

Ensuite, dans votre terminal, exécutez la commande suivante :

 $ migrate create -ext sql -dir db/migration -seq tracking_inventory_schema

Le drapeau -ext fait référence à l’extension que vous souhaitez pour la migration. Dans ce cas, c’est sql. Le drapeau -dir se réfère au répertoire où vous voulez créer les fichiers. Le drapeau -seq se réfère au numéro séquentiel pour les fichiers de migration.

Dans VS Code, il devrait y avoir deux fichiers : l’un pour up et un autre pour down. Le premier est utilisé pour faire des modifications avant dans le répertoire tandis que le second est pour annuler les modifications.

Dans le fichier up, vous allez coller votre schéma dans le fichier.

Mon schéma ressemble à celui-ci :

CREATE TABLE "inventory" (
  "id" uuid PRIMARY KEY,
  "item" varchar NOT NULL,
  "serial_number" varchar NOT NULL,
  "user" uuid NOT NULL,
  "created_at" timestamptz NOT NULL DEFAULT 'now()'
);

CREATE TABLE "user" (
  "id" uuid PRIMARY KEY,
  "name" varchar NOT NULL,
  "email" varchar UNIQUE NOT NULL,
  "password" varchar NOT NULL,
  "created_at" timestamptz NOT NULL DEFAULT 'now()'
);

CREATE INDEX ON "inventory" ("item");

ALTER TABLE "inventory" ADD FOREIGN KEY ("user") REFERENCES "user" ("id");

Votre schéma peut ressembler à différents projets selon ce que vous construisez.

Pour le fichier down, collez simplement cela :

DROP TABLE IF EXISTS inventory;
DROP TABLE IF EXISTS user;

La table d’inventaire devrait d’abord être supprimée parce qu’elle référence la table des utilisateurs.

Comment créer et supprimer la base de données à l’intérieur et à l’extérieur d’un conteneur Postgres Docker

Vérifiez si votre conteneur Docker est en cours d’exécution en utilisant la commande :

$ docker ps

Si ce n’est pas le cas, utilisez la commande docker start ${container name} pour le démarrer.

La prochaine étape consiste à accéder à la console Postgres en utilisant la commande suivante, puisque je suis sur Linux :

$ docker exec -it postgres14 bin/bash

Le flag -it signifie shell interactif/terminal. Dans cette console, vous pouvez exécuter la commande createdb :

/# createdb --username=root --owner=root tracking_inventory

Une fois créée, vous pouvez exécuter la commande psql pour interagir avec la base de données :

/# psql tracking-inventory
psql (14.12)
Type "help" for help.

tracking_inventory=#

Vous pouvez également supprimer la base de données avec la commande dropdb.

Pour quitter la console, utilisez la commande exit.

Pour créer la base de données à l’extérieur du conteneur Postgres, collez la commande suivante :

$ docker exec -it postgres14 createdb --username=root --owner=root tracking_inventory

Comment afficher la base de données dans TablePlus

Pour afficher la base de données que vous avez créée, connectez-vous en utilisant la connexion que nous avons établie plus tôt. Elle vous amènera au racine de la base de données, puis cliquez sur l’icône de la base de données en haut.

La base de données créée apparaîtra, puis cliquez simplement sur ouvrir pour l’ouvrir

Comment exécuter les migrations

Pour exécuter les migrations, exécutez cette commande dans votre terminal :

$ migrate -path db/migration -database "postgresql://root:passwordd@localhost:5432/tracking_inventory?sslmode=disable" -verbose up

Le drapeau -path spécifie le chemin contenant les fichiers de migration. L’option -database spécifie l’URL vers la base de données.

Dans l’URL, le pilote est postgresql. Le nom d’utilisateur et le mot de passe sont respectivement root et passwordd. Il est également important d’ajouter l’option sslmode=disable car Postgres ne configure pas SSL par défaut.

Maintenant, exécutez les migrations :

$ migrate -path db/migration -database "postgresql://root:passwordd@localhost:5432/tracking_inventory?sslmode=disable" -verbose up
calhost:5432/tracking_inventory?sslmode=disable" -verbose up
2024/06/25 00:13:25 Start buffering 1/u tracking_inventory_schema
2024/06/25 00:13:25 Read and execute 1/u tracking_inventory_schema
2024/06/25 00:13:26 Finished 1/u tracking_inventory_schema (read 43.186044ms, ran 255.501635ms)
2024/06/25 00:13:26 Finished after 312.928488ms
2024/06/25 00:13:26 Closing source and database

La migration est réussie !

Rechargez la base de données et observez les nouvelles tables :

##Conclusion

Dans ce tutoriel, vous avez appris comment écrire et exécuter des migrations de base de données en utilisant Docker et Postgres en Go de manière transparente. J’espère que vous avez appris beaucoup grâce à cet article.

Vous pouvez me contacter sur twitter ou sur linkedin.