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 Migration?
- Hoe start en draai je een Docker-container?
- Hoe maak je een schema aan en gebruik je TablePlus?
- Hoe installeer je golang-migrate?
- Hoe maak je een nieuwe migratie?
- Hoe maak je en verwijder je de database binnen en buiten een Docker Postgres-container?
- Hoe de database in TablePlus te bekijken
- Hoe de migraties uit te voeren
- Conclusie
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.
Source:
https://www.freecodecamp.org/news/how-to-create-database-migrations-in-go/