Datenbankmigrationen in Go (Golang): So verwalten Sie Ihr Datenschema
\n\nBei der Entwicklung von Anwendungen in Go stellt sich früher oder später die Notwendigkeit, die Datenbankstruktur zu ändern: neue Tabellen hinzufügen, bestehende Spalten ändern, Indizes erstellen. Die manuelle Ausführung von SQL-Skripten in verschiedenen Umgebungen (lokale Entwicklungsumgebung, Staging, Produktion) führt zu Fehlern und Synchronisationsproblemen. Die Lösung sind Datenbankmigrationen (database migrations).
\n\nIm Go-Ökosystem gibt es mehrere ausgereifte Bibliotheken zur Verwaltung von Migrationen. In diesem Artikel werden wir die drei beliebtesten Tools im Detail besprechen: golang-migrate/migrate, pressly/goose und rubenv/sql-migrate. Sie erfahren, wie Sie jedes davon installieren, konfigurieren und verwenden, und lernen die besten Praktiken kennen.
Was sind Migrationen und warum werden sie benötigt?
\n\nEine Migration ist eine Datei (oder eine Reihe von Dateien), die SQL-Befehle zum Ändern des Datenbankschemas enthält. Jede Migration hat eine eindeutige Kennung (normalerweise einen Zeitstempel oder eine Nummer) und zwei Richtungen: up (Anwenden der Änderungen) und down (Rückgängigmachen der Änderungen).
\n\nDie Hauptvorteile der Verwendung von Migrationen:
\n- \n
- Schematische Versionierung – der Änderungsverlauf wird zusammen mit dem Code im Repository gespeichert. \n
- Reproduzierbarkeit – identische Änderungen in allen Umgebungen. \n
- Rückgängigmachen von Änderungen – die Möglichkeit, schnell zur vorherigen Schema-Version zurückzukehren. \n
- Teamarbeit – Entwickler überschreiben nicht gegenseitig ihre Änderungen. \n
1. golang-migrate/migrate
\n\nDie beliebteste Bibliothek für Migrationen in Go. Unterstützt PostgreSQL, MySQL, SQLite, MongoDB und viele andere Datenbanken.
\n\nInstallation
\ngo get -u github.com/golang-migrate/migrate/v4\ngo install -tags 'postgres' github.com/golang-migrate/migrate/v4/cmd/migrate@latest\n\nStruktur der Migrationen
\nErstellen Sie einen Ordner migrations und fügen Sie Dateien mit einem Präfix im Format {timestamp}_{title}.{direction}.sql hinzu:
migrations/\n 000001_create_users_table.up.sql\n 000001_create_users_table.down.sql\n 000002_add_email_column.up.sql\n 000002_add_email_column.down.sql\n\nBeispiel einer Migration (up)
\n-- 000001_create_users_table.up.sql\nCREATE TABLE users (\n id SERIAL PRIMARY KEY,\n name VARCHAR(100) NOT NULL,\n created_at TIMESTAMP DEFAULT NOW()\n);\n\nBeispiel einer Migration (down)
\n-- 000001_create_users_table.down.sql\nDROP TABLE IF EXISTS users;\n\nAnwenden von Migrationen aus Go-Code
\npackage main\n\nimport (\n "github.com/golang-migrate/migrate/v4"\n _ "github.com/golang-migrate/migrate/v4/database/postgres"\n _ "github.com/golang-migrate/migrate/v4/source/file"\n)\n\nfunc main() {\n m, err := migrate.New(\n "file://migrations",\n "postgres://localhost:5432/mydb?sslmode=disable")\n if err != nil {\n panic(err)\n }\n if err := m.Up(); err != nil && err != migrate.ErrNoChange {\n panic(err)\n }\n}\n\n2. pressly/goose
\n\nGoose ist ein leichtes und schnelles Tool, das auch das Schreiben von Migrationen in Go (nicht nur in SQL) unterstützt. Ideal für Projekte, die Logik auf Codeebene erfordern.
\n\nInstallation
\ngo get github.com/pressly/goose/v3/cmd/goose\n\nErstellen einer Migration
\ngoose create create_users_table sql\n\nEs wird eine Datei namens 20250101120000_create_users_table.sql erstellt. Inhalt:
-- +goose Up\nCREATE TABLE users (\n id SERIAL PRIMARY KEY,\n name VARCHAR(100) NOT NULL\n);\n\n-- +goose Down\nDROP TABLE IF EXISTS users;\n\nGo-Migrationen (fortgeschrittene Variante)
\nGoose ermöglicht das Schreiben von Migrati
Auch in der Bibliothek
E-Mail-Versand mit Rust: Die Bibliotheken lettre und mailparse für die E-Mail-Verarbeitung
Java-Standardbibliothek (Java Standard Library)
Glide/Coil für Kotlin: Komplettguide mit Beispielen