Einleitung: Warum Go und Datenbanken ein ideales Paar sind
Die Programmiersprache Go (Golang) hat aufgrund ihrer hohen Leistung, der integrierten Unterstützung für Nebenläufigkeit und der einfachen Bereitstellung an Popularität gewonnen. Die wahre Stärke von Go zeigt sich jedoch bei der Arbeit mit Datenbanken. Ob es sich um die relationale PostgreSQL oder die dokumentenorientierte MongoDB handelt, Go bietet elegante Werkzeuge für eine effiziente Interaktion mit Daten.
In diesem Artikel werden wir die praktischen Aspekte der Verbindung, der Durchführung von CRUD-Operationen und der Optimierung von Abfragen für PostgreSQL und MongoDB in Go behandeln. Sie erfahren, wie Sie Standardpakete und gängige Treiber verwenden, um zuverlässigen und schnellen Code zu schreiben.
1. Arbeiten mit PostgreSQL in Go
Für die Arbeit mit PostgreSQL in Go wird das Standardpaket database/sql zusammen mit dem Treiber pgx oder lib/pq verwendet. pgx wird aufgrund der besseren Leistung und der Unterstützung erweiterter PostgreSQL-Funktionen empfohlen.
1.1. Installation und Verbindung
Installieren Sie den Treiber über go modules:
go get github.com/jackc/pgx/v5Beispiel für eine Verbindung zur Datenbank:
package main
import ( "context" "fmt" "github.com/jackc/pgx/v5/pgxpool" "log")
func main() { dsn := "postgres://user:password@localhost:5432/mydb?sslmode=disable" pool, err := pgxpool.New(context.Background(), dsn) if err != nil { log.Fatal("Unable to connect to database:", err) } defer pool.Close()
fmt.Println("Connected to PostgreSQL!")}Tipp: Verwenden Sie einen Verbindungspool (pgxpool) für die Produktionsumgebung – dies reduziert den Overhead beim Aufbau neuer Verbindungen.
1.2. CRUD-Operationen
Betrachten wir die grundlegenden Operationen am Beispiel der Tabelle users:
// CREATEfunc createUser(pool *pgxpool.Pool, name string, email string) (int, error) { var id int err := pool.QueryRow(context.Background(), "INSERT INTO users (name, email) VALUES ($1, $2) RETURNING id", name, email).Scan(&id) if err != nil { return 0, err } return id, nil}
// READfunc getUser(pool *pgxpool.Pool, id int) (string, string, error) { var name, email string err := pool.QueryRow(context.Background(), "SELECT name, email FROM users WHERE id = $1", id).Scan(&name, &email) if err != nil { return "", "", err } return name, email, nil}
// UPDATEfunc updateUserEmail(pool *pgxpool.Pool, id int, newEmail string) error { _, err := pool.Exec(context.Background(), "UPDATE users SET email = $1 WHERE id = $2", newEmail, id) return err}
// DELETEfunc deleteUser(pool *pgxpool.Pool, id int) error { _, err := pool.Exec(context.Background(), "DELETE FROM users WHERE id = $1", id) return err}Beachten Sie die Verwendung parametrisierter Abfragen mit $1, $2 – dies schützt vor SQL-Injection.
1.3. Transaktionen
PostgreSQL unterstützt Transaktionen, die für die Datenintegrität entscheidend sind:
func transferMoney(pool *pgxpool.Pool, fromID, toID int, amount float64) error { tx, err := pool.Begin(context.Background()) if err != nil { return err } defer tx.Rollback(context.Background()) // Rollback bei Fehler
_, err = tx.Exec(context.Background(), "UPDATE accounts SET balance = balance - $1 WHERE id = $2", amount, fromID) if err != nil { return err }
_, err = tx.Exec(context.Background(), "UPDATE accounts SET balance = balance + $1 WHERE id = $2", amount, toID) if err != nil { return err }
return tx.Commit(context.Background())}2. Arbeiten mit MongoDB in Go
MongoDB ist ein Dokument