Arbeit mit Datenbanken in Go: PostgreSQL und MongoDB in der Praxis

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

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/v5


Beispiel 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

Blogs

Buchempfehlungen