von Okure U. Edet
Go ist eine schnelle Programmiersprache mit einer relativ einfachen Syntax. Während des Lernens von Go ist es wichtig, zu erlernen, wie man APIs aufbaut und wie man sie verwendet, um mit Datenbanken zu kommunizieren. Während des Lernprozesses entschied ich mich, ein Projekt anzunehmen, das mir in dieser Hinsicht behilflich war: eine einfache Inventarverwaltungs-API.
Beim Arbeiten mit einer SQL-Datenbank wie Postgres lernte ich, dass es wichtig ist, Änderungen an der Datenbank zeitnah durchzuführen. Also, wenn du ein Schema hast, das du in der Zukunft ändern könntest, ist der beste Weg, das zu tun, mit Datenbankmigrationen. Dies sichert, dass Änderungen an der Datenbank korrekt durchgeführt werden, ohne existierendes Data zu beeinflussen.
In diesem Artikel lernst du über Datenbankmigrationen mit Docker und Postgres.
Inhaltsverzeichnis
- Was ist Datenbankmigration?
- Wie starte und führe ich ein Docker-Container aus?
- Wie erstelle und führe ich ein Schema mit TablePlus aus?
- Wie installiere ich golang-migrate
- Wie erstelle ich eine neue Migration?
- Wie erstelle und lösche ich die Datenbank innerhalb und außerhalb eines Docker Postgres-Containers?
- Wie man die Datenbank in TablePlus anschauen
- Wie man die Migrationsdateien ausführt
- Schlussfolgerung
Was ist Datenbankmigration?
Was ist Datenbankmigration und warum sollte man sie verwenden? Nun, als Backend-Entwickler, wenn man an einem Projekt arbeitet, das Daten in einer Datenbank speichern需求, muss man eine Schema für die zu speichernden Daten entwickeln.
Datenbankmigration hilft dabei, die Struktur der Daten innerhalb der Datenbank und in diesem Fall einer relationalen Datenbank zu verwalten. Migrationsprozesse helfen, Schemas von einem aktuellen Zustand in einen bestimmten oder gewünschten Zustand zu ändern. Dies kann die Hinzufügung von Tabellen und Spalten, das Entfernen von Elementen oder den Wechsel von Typen und Constraints beinhalten.
Eine Bedeutung von Datenbankmigration ist die Verwaltung von Änderungen in einer Datenbank wiederholbar und flüssig zu halten, ohne dass das Datenverlust eine Beachtung verdient.
Es ist ratsam, Migrationsprozesse zu verwenden, wenn man sich nicht sicher ist, wie das endgültige Datenbankschema aussehen wird. In solcher Weise kann man Änderungen iterativ einführen.
Wie man einen Docker-Container startet und ausführt
Öffne deine Terminal und lege ein neues Verzeichnis an: `mkdir tracking-inventory-app`.
Drag dann ein Postgres-Image von Docker Hub herunter. Ich habe das Tag postgres:14-alpine
verwendet. Du kannst jedes Tag verwenden, das du möchtest.
Gebe im Terminal den folgenden Befehl ein und drücke Enter:
$ docker pull postgres:14-alpine
Nach der Installation starten Sie das Container-System mit dem Befehl `docker run`:
$ docker run --name postgres14 -e POSTGRES_USER=root -e POSTGRES_PASSWORD=passwordd -p 5432:5432 -d postgres:14-alpine
Das Flag `–name` bezieht sich auf den Namen des Containers. Das Flag `-e` bezieht sich auf die Umgebungsvariablen. Das Flag `-p` bedeutet, dass Sie veröffentlicht werden. Sie sollten Ihren Container auf einem bestimmten Port ausführen. Das Flag `-d` bedeutet, dass Sie es in abgetrennter Form ausführen möchten.
Nachdem Sie die Enter-Taste gedrückt haben, öffnen Sie Ihre Docker Desktop-Anwendung, wenn Sie sie installiert haben. Wenn nicht, können Sie sie von der Docker-Webseite herunterladen.
In Ihrer Docker Desktop-Anwendung sollten Sie sehen, dass der Container gestartet wurde:
Sie können mit TablePlus eine Verbindung mit der Datenbank herstellen:
Testen Sie die Verbindung. Wenn es „ok“ sagt, dann verbinden Sie sich. Wenn Sie unter Windows einen Authentifizierungsfehler haben, gehen Sie zum Startbutton und klicken Sie auf Run
. In der Popup-Fenster, tippen Sie services.msc
und drücken Sie Enter. Suchen Sie nach „postgres“ und klicken Sie auf den Dienst anzustoßen. Versuchen Sie dann erneut zu verbinden.
Wie man mit TablePlus ein Schema erstellt und ausführt
Ich habe ein vorher definiertes Schema/Modell für das tracking-inventory-Projekt mit db diagram erstellt. Dieses tracking-inventory soll Ihnen erlauben, ein Element hinzuzufügen, eine Seriennummer und einen Wert. Daher wird das Schema Eigenschaften wie item
, serial_number
, id
und created_at
haben.
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");
Das ist das Aussehen meines. Sie können Ihre TablePlus öffnen und den generierten PostgreSQL-Code hinzufügen und ausführen.
Wie man golang-migrate installiert
Der nächste Schritt besteht darin, golang-migrate
auf Ihrem System zu installieren. Ich verwende Linux auf Windows für diesen Tutorial.
Um es zu installieren, besuchen Sie diese Dokumentation.
Ich verwende Linux, daher werde ich curl
verwenden:
$ curl -L https://github.com/golang-migrate/migrate/releases/download/v4.12.2/migrate.linux-amd64.tar.gz | tar xvz
Wenn die Installation erfolgreich war, führen Sie im Terminal den Befehl migrate -help
aus, um die verschiedenen Befehle zu sehen.
Wie man eine neue Migration erstellt
Nach der Installation von golang-migrate
können Sie ein neues Migrations-Skript erstellen.
Zunächst öffnen Sie im Terminal und im Verzeichnis der tracking-app den VS Code mit dem Befehl code
.
Wenn das erledigt ist, erstellen Sie einen neuen Ordner namens db
und einen weiteren Ordner innerhalb des db-Ordners namens migrations
.
Dann führen Sie im Terminal den folgenden Befehl aus:
$ migrate create -ext sql -dir db/migration -seq tracking_inventory_schema
Der Parameter -ext
bezieht sich auf die Erweiterung, mit der Sie die Migration erstellen möchten. In diesem Fall ist es sql. Der Parameter -dir
bezieht sich auf das Verzeichnis, in dem Sie die Dateien erstellen möchten. Der Parameter -seq
bezieht sich auf die sequentielle Nummer der Migrationsdateien.
Innerhalb Ihres VS Codes sollten sich zwei Dateien befinden: eine für up
und eine für down
. Letztere wird verwendet, um die Änderungen im Verzeichnis rückgängig zu machen, während die Erste für die vorwärts gerichteten Änderungen verwendet wird.
In der Datei up
werden Sie Ihren Schema-Code in die Datei einfügen.
Mein Schema sieht so aus:
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");
Ihr könnte anders aussehen, je nachdem, was ihr Projekt ist.
Für die Datei down
, fügt ihr nur dies ein:
DROP TABLE IF EXISTS inventory;
DROP TABLE IF EXISTS user;
Die Bestandsdatenbank sollte zunächst abgelegt werden, weil sie auf die Benutzerdatenbank verweist.
Wie man die Datenbank innerhalb und außerhalb eines Docker Postgres-Containers erstellt und ablegt
Überprüfen Sie, ob Ihr Docker-Container läuft, indem Sie den Befehl verwenden:
$ docker ps
Wenn nicht, verwenden Sie den Befehl docker start ${container name}
, um ihn zu starten.
Der nächste Schritt besteht darin, den Postgres-Shell mit dem folgenden Befehl zuzugreifen, da ich auf Linux bin:
$ docker exec -it postgres14 bin/bash
Das Flag -it
steht für interaktives Shell/Terminal. In diesem Shell können Sie den Befehl createdb
ausführen:
/# createdb --username=root --owner=root tracking_inventory
Sobald die Datenbank erstellt wurde, können Sie den Befehl psql
verwenden, um mit der Datenbank zu interagieren:
/# psql tracking-inventory
psql (14.12)
Type "help" for help.
tracking_inventory=#
Sie können auch die Datenbank mit dem Befehl dropdb
löschen.
Um das Terminal zu verlassen, verwenden Sie den Befehl exit
.
Um die Datenbank außerhalb des Postgres-Containers zu erstellen, fügt ihr den folgenden Befehl ein:
$ docker exec -it postgres14 createdb --username=root --owner=root tracking_inventory
Wie man die Datenbank in TablePlus anzeigt
Um die Datenbank, die ihr erstellt haben, anzuzeigen, verbindet ihr sich mit der zuvor eingerichteten Verbindung. Es bringt euch zum Wurzeldatenbank und klickt dann oben auf das Datenbank-Symbol.
Die erstellte Datenbank wird angezeigt, dann klickt ihr nur auf öffnen
, um sie zu öffnen.
Wie man die Migrationsdateien ausführt
Um die Migrationsdateien auszuführen, führt ihr diesen Befehl im Terminal aus:
$ migrate -path db/migration -database "postgresql://root:passwordd@localhost:5432/tracking_inventory?sslmode=disable" -verbose up
Der -path
-Flag gibt den Pfad an, der die Migrationsdateien enthält. Die -database
-Option gibt die URL zur Datenbank an.
In der URL ist der Treiber postgresql
. Der Benutzername und das Passwort sind respective root
und passwordd
. Es ist auch wichtig, die Option sslmode=disable
hinzuzufügen, da Postgres standardmäßig kein SSL aktiviert.
Jetzt kann die Migration ausgeführt werden:
$ 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
Die Migration war erfolgreich!
Aktualisieren Sie die Datenbank und sehen Sie die neuen Tabellen:
##Fazit
Durch dieses Tutorial haben Sie gelernt, wie Sie mit Docker und Postgres in Go problemlos Datenbankmigrationen schreiben und ausführen können. Ich hoffe, Sie haben viel aus diesem Artikel gelernt.
Sie können sich mit mir auf twitter oder auf linkedin verbinden.
Source:
https://www.freecodecamp.org/news/how-to-create-database-migrations-in-go/