Okure U. Edet
Go è un linguaggio di programmazione veloce con una sintassi relativamente semplice. Mentre impari a usare Go, è importante capire come creare API e come usarle per comunicare con i database. Nell’apprendimento, ho deciso di assumere un progetto che mi ha aiutato in questo senso: una semplice API per la gestione dell’inventario.
Mentre lavoravo con un database SQL come Postgres, ho imparato che è importante apportare modifiche al database in modo tempestivo. Quindi, se hai un schema che potresti modificare in futuro, il modo migliore per farlo è usando le migrazioni del database. Questo assicura che le modifiche al database siano effettuate accurate e senza interessare ai dati esistenti.
In questo articolo, imparerai le migrazioni del database usando Docker e Postgres.
Indice
- Cos’è una Migrazione del Database?
- Come Avviare e Eseguire un Contenitore Docker
- Come Creare e Eseguire un Schema Usando TablePlus
- Come Installare golang-migrate
- Come Creare una Nuova Migrazione
- Come Creare e Eliminare il Database all’Interno e all’Externo di un Contenitore Postgres Docker
- Come visualizzare il database in TablePlus
- Come eseguire le migrazioni
- Conclusioni
Che cos’è la migrazione del database?
Che cos’è la migrazione del database e perché dovresti usarla? Beh, come sviluppatore backend, quando lavori su un progetto che richiede di memorizzare dati in un database, dovrai sviluppare uno schema per i dati che desideri memorizzare.
Le migrazioni del database ti aiutano a gestire la struttura dei dati all’interno di un database e in questo caso, di un database relazionale. Le migrazioni aiutano a modificare gli schemi dall’attuale allo stato specifico/desiderato. Può coinvolgere l’aggiunta di tabelle e colonne, la rimozione di elementi o il cambio di tipi e vincoli.
Una delle importanze della migrazione del database è quella di apportare modifiche in un database in modo ripetibile e senza problemi senza preoccuparsi della perdita di dati.
Si consiglia di utilizzare le migrazioni se non hai la certezza di come sarà il tuo schema dati finale. In questo senso, puoi implementare le modifiche in modo incrementale.
Come avviare e eseguire un container Docker
Apri il tuo terminale e crea una nuova directory mkdir tracking-inventory-app
.
Quindi scarica un’immagine postgres da Docker Hub. Ho usato il tag postgres:14-alpine
. Puoi usare qualsiasi tag desideri.
Nel tuo terminale, incolla il seguente comando e premi enter:
$ docker pull postgres:14-alpine
Dopo averlo installato, avvia il contenitore utilizzando il comando docker run
:
$ docker run --name postgres14 -e POSTGRES_USER=root -e POSTGRES_PASSWORD=passwordd -p 5432:5432 -d postgres:14-alpine
La flag --name
si riferisce al nome del contenitore. La flag -e
si riferisce alle variabili d’ambiente. La flag -p
significa pubblicare. Devi avviare il tuo contenitore su una porta specifica. La flag -d
significa che vuoi avviarlo in modalità separata.
Dopo aver premuto Invio, apri il tuo Docker Desktop se lo hai installato. Se non lo hai, puoi scaricarlo dalla docker website.
Nel tuo Docker Desktop, dovresti vedere che il contenitore è stato avviato:
Puoi stabilire una connessione con il database utilizzando TablePlus:
Prova la connessione. Se dice ok, allora collegati. Se sei su Windows e mostra un errore di autenticazione, naviga fino al tuo pulsante Start e clicca su Esegui
. Nel pop-up, digita services.msc
e premi Invio. Cerca postgres e clicca su Servizio Stop. Poi prova a collegarti di nuovo.
Come creare e avviare un schema utilizzando TablePlus
Ho creato un schema/modello predefinito per il progetto tracking-inventory con db diagram. Questo tracking-inventory dovrebbe consentire di aggiungere un articolo, numero di serie e valore. Quindi il schema avrà i campi item
, serial_number
, id
e 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");
Ecco come mi apparirà. Puoi aprire il tuo TablePlus e aggiungere il codice PostgreSQL generato e eseguirlo.
Come installare golang-migrate
Il prossimo passo è installare golang-migrate sul tuo sistema. In questo tutorial utilizzerò Windows con Linux.
Per installarlo, visita questa documentazione.
Utilizzo Linux quindi userò curl
:
$ curl -L https://github.com/golang-migrate/migrate/releases/download/v4.12.2/migrate.linux-amd64.tar.gz | tar xvz
Una volta installato correttamente, esegui nel tuo terminale il comando migrate -help
per vedere i suoi vari comandi.
Come creare una nuova migrazione
Dopo aver installato golang-migrate, puoi creare un nuovo script di migrazione.
Prima di tutto, nel tuo terminale e nella directory tracking-app, apri VS Code con il comando code
.
Una volta fatto, crea una nuova cartella chiamata db
e dentro la cartella db, crea un’altra cartella chiamata migrations
.
Poi nel tuo terminale, esegui il seguente comando:
$ migrate create -ext sql -dir db/migration -seq tracking_inventory_schema
Il flag -ext
si riferisce all’estensione con cui vuoi creare la migrazione. In questo caso, è sql. Il flag -dir
si riferisce alla directory in cui vuoi creare i file. Il flag -seq
si riferisce al numero sequenziale per i file di migrazione.
Inside your VS code, there should be two files: one for up
and another for down
. The former is used to make forward changes to the directory while the latter is for reversing the changes.
In the up
file, you are going to paste your schema to the file.
Il mio schema è così:
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");
Il vostro potrebbe essere diverso a seconda del progetto in cui state lavorando.
Per il file down
, semplicemente incollate questo:
DROP TABLE IF EXISTS inventory;
DROP TABLE IF EXISTS user;
La tabella dell’inventario dovrebbe essere cancellata per prima perché fa riferimento alla tabella utenti.
Come creare e cancellare il database dentro e fuori dal contenitore Postgres Docker
Controllate se il contenitore Docker è in esecuzione usando il comando:
$ docker ps
Se non lo è, usate il comando docker start ${container name}
per avviarlo.
Il prossimo passo è accedere alla shell Postgres usando il seguente comando, dato che io sono su Linux:
$ docker exec -it postgres14 bin/bash
La bandiera -it
sta per shell/terminal interattivo. Dentro questa shell, puoi eseguire il comando createdb
:
/# createdb --username=root --owner=root tracking_inventory
Una volta creata, puoi eseguire il comando psql
per interagire con il db:
/# psql tracking-inventory
psql (14.12)
Type "help" for help.
tracking_inventory=#
Puoi anche cancellare il database con il comando dropdb
.
Per uscire dalla shell, usate il comando exit
.
Per creare il database fuori dal contenitore Postgres, incollate il seguente comando:
$ docker exec -it postgres14 createdb --username=root --owner=root tracking_inventory
Come visualizzare il database in TablePlus
Per visualizzare il database che hai creato, collegati usando la connessione precedente che abbiamo creato prima. Tiporterà nella root database e poi fare clic sull’icona del db in alto.
La database creata apparirà, poi semplicemente fare clic su open
per aprirla
Come eseguire le migrazioni
Per eseguire le migrazioni, eseguite questo comando nel vostro terminale:
$ migrate -path db/migration -database "postgresql://root:passwordd@localhost:5432/tracking_inventory?sslmode=disable" -verbose up
La bandiera -path
specifica il percorso che contiene i file di migrazione. L’opzione -database
specifica l’URL della database.
All’interno dell’URL, il driver è postgresql
. Il nome utente e la password sono rispettivamente root
e passwordd
. È anche importante aggiungere l’opzione sslmode=disable
perché Postgres non abilita SSL in modo predefinito.
Ora eseguite le migrazioni:
$ 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 migrazione è riuscita!
Aggiornate la database e vedete le nuove tabelle:
##Conclusione
Durante questo tutorial, avete imparato come scrivere e eseguire in maniera fluida le migrazioni del database in Go usando Docker e Postgres. Spero che questo articolo vi sia stato utile.
Source:
https://www.freecodecamp.org/news/how-to-create-database-migrations-in-go/