By Okure U. Edet

Go is een snelle programmeertaal met een relatief eenvoudige syntaxis. Bij het leren van Go is het belangrijk om te leren hoe je APIs bouwt en ze gebruikt om te communiceren met databases. Tijdens het leren nam ik een project op mij die mij daarin hielp: een eenvoudige API voor inventarisvolging.

Terwijl je werkt met een SQL-database zoals Postgres, leerde ik dat het belangrijk is om op tijd wijzigingen aan de database door te voeren. Dus als je een schema hebt dat je in de toekomst mogelijk wilt wijzigen, is de beste manier om dat te doen via database-migraties. Dit zorgt ervoor dat wijzigingen aan de database accurate zijn zonder bestaande gegevens te beïnvloeden.

In dit artikel leer je over database-migraties met Docker en Postgres.

Inhoudsopgave

Wat is database migratie?

Wat is database migratie en waarom zou je het gebruiken? Als backend-ontwikkelaar werk je aan projecten die vereisen dat je gegevens in een database opslaat, en daarvoor moet je een schema ontwikkelen voor de gegevens die je wilt opslaan.

Database-migraties helpen je bij het beheren van de structuur van gegevens binnen een database en in dit geval binnen een relationele database. Migraties helpen bij het wijzigen van schema’s vanaf de huidige staat naar een specifieke/gewenste staat. Het kan betreffen het toevoegen van tabellen en kolommen, het verwijderen van elementen of het wijzigen van types en beperkingen.

Een belangrijkheid van database migratie is om wijzigingen in een database herhaalbaar en pijnloos uit te voeren zonder het risico op gegevensverlies.

Het wordt aangeraden om migraties te gebruiken als je niet zeker weet wat je uiteindelijke gegevensschema eruit zal zien. Op die manier kun je stapsgewijs wijzigingen doorvoeren.

Hoe start je en draai je een Docker-container

Open je terminal en maak een nieuwe map met mkdir tracking-inventory-app.

Vervolgens haal je een postgres-image op van Docker Hub. Ik gebruikte de tag postgres:14-alpine. Je kunt elke tag gebruiken die je wilt.

Plak in je terminal het volgende en druk op enter:

$ docker pull postgres:14-alpine

Nadat u de container heeft geïnstalleerd, start deze met behulp van de opdracht docker run:

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

Het vlagje --name verwijst naar de naam van de container. Het vlagje -e verwijst naar de omgevingsvariabelen. Het vlagje -p betekent publiceren. U moet uw container op een bepaalde poort draaien. Het vlagje -d betekend dat u deze in afzonderlijk modus wilt draaien.

Nadat u Enter heeft gedrukt, open uw Docker Desktop als u deze heeft geïnstalleerd. Als u deze niet heeft, kunt u hem downloaden van de website van Docker.

In uw Docker Desktop zou u moeten zien dat de container is gestart:

U kunt een verbinding maken met de database met behulp van TablePlus:

Test de verbinding. Als het ok zegt, maak dan de verbinding. Als u op Windows bent en het een authenticatiefout toont, ga naar uw Startknop en klik op Uitvoeren. In het pop-upvenster typ u services.msc en druk op Enter. Zoek naar postgres en klik op stoppen service. Probeer dan opnieuw verbinding te maken.

Hoe een schema met TablePlus aanmaken en uitvoeren

Ik heb een voorgedefinieerd schema/model aangemaakt voor het project tracking-inventory met db diagram. Dit tracking-inventory moet u toestaan om een item, serial number en waarde toe te voegen. Dus zal het schema een veld bevatten voor item, serial_number, id en 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");

Dit is hoe mijn eruitziet. U kunt uw TablePlus openen en de gegenereerde PostgreSQL-code toevoegen en uitvoeren.

Hoe te installeren golang-migrate

De volgende stap is om golang-migrate op uw systeem te installeren. Ik gebruik Linux op Windows voor deze tutorial.

Om het te installeren, bezoek deze documentatie.

Ik gebruik Linux dus ik zal curl gebruiken:

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

Als het succesvol is geïnstalleerd, voer in uw terminal het commando migrate -help uit om de verschillende commando’s te zien.

Hoe een nieuwe migratie te maken

Nadat golang-migrate is geïnstalleerd, kunt u een nieuw migratiescript maken.

Eerst, open in uw terminal en binnen de tracking-app map, VS code met het commando code.

Als dat is gedaan, maak een nieuwe map genaamd db en nog een map binnen de db map genaamd migrations.

Voer vervolgens in uw terminal het volgende commando uit:

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

De -ext vlag verwijst naar de extensie die u wilt gebruiken voor de migratie. In dit geval is het sql. De -dir vlag verwijst naar de map waarin u de bestanden wilt maken. De -seq vlag verwijst naar de sequentiële nummering voor de migratiebestanden.

Binnen uw VS code zou er moeten zitten twee bestanden: één voor up en één voor down. De voormalige wordt gebruikt om voorwaartse wijzigingen aan de map aan te brengen terwijl de laatste wordt gebruikt om de wijzigingen ongedaan te maken.

In het up bestand, plak uw schema in het bestand.

Mijn schema ziet er als volgt uit:

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");

Uw schema zal afhankelijk zijn van het project dat u bouwt.

Voor het bestand down moet u dit plakken:

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

De inventory tabel moet eerst worden verwijderd omdat hij de user tabel verwijst.

Hoe om een database te maken en te verwijderen binnen en buiten een Docker Postgres container

Controleer of uw docker container actief is met de opdracht:

$ docker ps

Als het niet actief is, gebruik dan de opdracht docker start ${container name} om het te starten.

Het volgende stappen is om toegang te krijgen tot de postgres shell met de volgende opdracht omdat ik op Linux ben:

$ docker exec -it postgres14 bin/bash

Het -it vlag staan voor interactieve shell/terminal. Binnen deze shell kun je de createdb opdracht uitvoeren:

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

Eenmaal aangemaakt kun je de psql opdracht gebruiken om met de db te communiceren:

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

tracking_inventory=#

U kunt de database ook verwijderen met de dropdb opdracht.

Gebruik de exit opdracht om de shell te verlaten.

Om de database buiten het postgres container te maken, plak dan de volgende opdracht:

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

Hoe om de database in TablePlus te bekijken

Om de database die u heeft aangemaakt te bekijken, maak verbinding met de eerder aangemaakte verbinding. Het zal u naar de root database brengen en klik dan op het db pictogram bovenaan.

De aangemaakte database verschijnt, klik dan simpelweg op open om hem te openen

Hoe om de migraties uit te voeren

Om de migraties uit te voeren, voer deze opdracht in uw terminal uit:

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

De -path vlag specificeert het pad dat de migratiebestanden bevat. De -database optie specificeert de url naar de database.

Binnen de url is de driver postgresql. De gebruikersnaam en het wachtwoord zijn respectievelijk root en passwordd. Het is ook belangrijk om de optie sslmode=disable toe te voegen omdat Postgres standaard geen SSL inschakelt.

Voer nu de migraties uit:

$ 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

De migratie is succesvol!

Ververs de database en zie de nieuwe tabellen:

##Conclusie

Doorheen dit handleiding heb je geleerd hoe je zonder problemen database-migraties in Go kunt schrijven en uitvoeren met Docker en Postgres. Ik hoop dat je veel van dit artikel hebt geleerd.

Je kunt met mij in contact komen via twitter of op linkedin.