Arbeiten mit Datenbanken in Go: PostgreSQL und MongoDB für Anfänger
Go (Golang) ist eine moderne kompilierte Sprache, die aufgrund ihrer hohen Leistung, Einfachheit und integrierten Unterstützung für Nebenläufigkeit an Popularität gewonnen hat. Bei der Entwicklung von Webdiensten und Anwendungen besteht fast immer die Notwendigkeit, mit Datenbanken zu interagieren. In diesem Artikel betrachten wir, wie man mit zwei beliebten DBMS arbeitet: dem relationalen PostgreSQL und der dokumentenorientierten MongoDB. Das Material richtet sich an Anfänger, die bereits mit den Grundlagen von Go vertraut sind.
1. Umgebungsvorbereitung und Treiberinstallation
Stellen Sie vor dem Start sicher, dass Go (Version 1.16+) installiert ist und die entsprechenden DBMS ausgeführt werden. Für die Arbeit mit PostgreSQL wird der Treiber lib/pq benötigt, für MongoDB der offizielle Treiber mongo-go-driver.
go get github.com/lib/pqgo get go.mongodb.org/mongo-driver/mongoErstellen Sie ein neues Modul:
go mod init example.com/db-demo2. Arbeiten mit PostgreSQL in Go
PostgreSQL ist eine leistungsstarke relationale Datenbank mit SQL-Unterstützung. In Go verwenden wir das Standardpaket database/sql zusammen mit dem Treiber lib/pq.
2.1 Verbindung zur Datenbank herstellen
Für die Verbindung muss die Verbindungszeichenfolge (DSN) im Format angegeben werden: host=... port=... user=... password=... dbname=... sslmode=disable.
package main
import ( "database/sql" "fmt" "log" _ "github.com/lib/pq")
func main() { connStr := "host=localhost port=5432 user=postgres password=secret dbname=testdb sslmode=disable" db, err := sql.Open("postgres", connStr) if err != nil { log.Fatal(err) } defer db.Close()
err = db.Ping() if err != nil { log.Fatal("Verbindung fehlgeschlagen:", err) } fmt.Println("Verbindung zu PostgreSQL hergestellt!")}2.2 Tabellenerstellung und CRUD-Operationen
Betrachten wir die Erstellung der Tabelle users und die Durchführung grundlegender Operationen.
// Tabelle erstellencreateTable := `CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, email VARCHAR(100) UNIQUE NOT NULL, age INT);`
_, err = db.Exec(createTable)if err != nil { log.Fatal(err)}
// Daten einfügensqlInsert := `INSERT INTO users (name, email, age) VALUES ($1, $2, $3) RETURNING id`var userID interr = db.QueryRow(sqlInsert, "Ivan Petrov", "ivan@example.com", 30).Scan(&userID)if err != nil { log.Fatal(err)}fmt.Printf("Benutzer mit ID hinzugefügt: %d", userID)
// Daten abfragenrows, err := db.Query("SELECT id, name, email, age FROM users")if err != nil { log.Fatal(err)}defer rows.Close()
for rows.Next() { var u struct { ID int Name string Email string Age int } err := rows.Scan(&u.ID, &u.Name, &u.Email, &u.Age) if err != nil { log.Fatal(err) } fmt.Printf("ID: %d, Name: %s, Email: %s, Alter: %d", u.ID, u.Name, u.Email, u.Age)}2.3 Verwendung vorbereiteter Abfragen
Vorbereitete Abfragen (prepared statements) erhöhen die Sicherheit und Leistung, insbesondere bei wiederholten Operationen.
stmt, err := db.Prepare("UPDATE users SET age = $1 WHERE id = $2")if err != nil { log.Fatal(err)}defer stmt.Close()
_, err = stmt.Exec(35, 1)if err != nil { log.Fatal(err)}fmt.Println("Alter des Benutzers aktualisiert")3. Arbeiten mit MongoDB in Go
MongoDB ist eine dokumentenorientierte NoSQL-Datenbank. In Go erfolgt die Arbeit damit über den offiziellen Treiber mongo-go-driver, der Kontexte zur Steuerung der Ausführungszeit von Operationen verwendet.
3.1 Verbindung zu MongoDB herstellen
pa