Einleitung: Warum Go und Datenbanken ein ideales Paar sind
\nGo (Golang) ist eine moderne, kompilierte Sprache, die von Google entwickelt wurde. Ihre Hauptvorteile sind hohe Leistung, Einfachheit und integrierte Unterstützung für Nebenläufigkeit. Wenn es um die Arbeit mit Datenbanken geht, bietet Go leistungsstarke Standardbibliotheken und beliebte Drittanbieter-Treiber für jedes DBMS.
\nIn diesem Artikel werden wir uns ansehen, wie man eine Verbindung herstellt und grundlegende Operationen mit den beiden beliebtesten Datenbanken durchführt: der relationalen PostgreSQL und der dokumentenorientierten MongoDB. Das Material richtet sich an Anfänger, die bereits mit den Grundlagen der Go-Syntax vertraut sind.
\n\n1. Vorbereitung der Umgebung und Installation der Treiber
\nBevor Sie Code schreiben, stellen Sie sicher, dass Go (Version 1.21+) installiert ist. Für die Arbeit mit Datenbanken benötigen wir Treiber. Installieren Sie diese mit den folgenden Befehlen:
\ngo get github.com/lib/pq // für PostgreSQL\ngo get go.mongodb.org/mongo-driver // für MongoDB\nStellen Sie außerdem sicher, dass die entsprechenden Datenbankserver auf Ihrem Rechner laufen (lokal oder über Docker).
\n\n1.1. Projektstruktur
\nErstellen Sie eine Datei main.go. Der Einfachheit halber wird die gesamte Logik darin konzentriert. In realen Projekten sollte der Code in Pakete aufgeteilt werden.
2. Arbeiten mit PostgreSQL in Go
\nPostgreSQL ist ein leistungsstarkes relationales DBMS. Für die Arbeit damit in Go verwenden wir das Paket database/sql und den Treiber lib/pq.
2.1. Verbindung zur Datenbank
\nErstellen wir eine Verbindungsfunktion. Die Verbindungszeichenfolge (DSN) enthält Host, Port, Benutzernamen und Datenbank.
\npackage main\n\nimport (\n "database/sql"\n "fmt"\n "log"\n\n _ "github.com/lib/pq"\n)\n\nfunc main() {\n connStr := "host=localhost port=5432 user=postgres password=secret dbname=testdb sslmode=disable"\n db, err := sql.Open("postgres", connStr)\n if err != nil {\n log.Fatal("Verbindungsfehler:", err)\n }\n defer db.Close()\n\n // Verbindung prüfen\n err = db.Ping()\n if err != nil {\n log.Fatal("Verbindung konnte nicht hergestellt werden:", err)\n }\n fmt.Println("Erfolgreich mit PostgreSQL verbunden!")\n}\nWichtig: sql.Open erstellt keine echte Verbindung, sondern nur einen Pool. Die eigentliche Verbindung wird bei der ersten Anfrage oder beim Aufruf von Ping() hergestellt.
2.2. Tabelle erstellen und Daten einfügen
\nJetzt erstellen wir eine Tabelle users und fügen einige Datensätze hinzu.
// Tabelle erstellen\ncreateTable := `\nCREATE TABLE IF NOT EXISTS users (\n id SERIAL PRIMARY KEY,\n name VARCHAR(100) NOT NULL,\n email VARCHAR(100) UNIQUE NOT NULL,\n age INT\n);`\n_, err = db.Exec(createTable)\nif err != nil {\n log.Fatal("Fehler beim Erstellen der Tabelle:", err)\n}\n\n// Daten einfügen\ninsert := `INSERT INTO users (name, email, age) VALUES ($1, $2, $3)`\n_, err = db.Exec(insert, "Ivan Petrov", "ivan@example.com", 30)\nif err != nil {\n log.Fatal("Einfügefehler:", err)\n}\nfmt.Println("Daten hinzugefügt")\nBeachten Sie die Verwendung der Platzhalter $1, $2 – dies schützt vor SQL-Injection.
2.3. Daten lesen und aktualisieren
\nFühren wir eine Abfrage zum Lesen durch und aktualisieren das Alter des Benutzers.
\n// Daten lesen\nrows, err := db.Query("SELECT id, name, email, age FROM users")\nif err != nil {\n log.Fatal(err)\n}\ndefer rows.Close()\n\nfor rows.Next() {\n var id int\n var name, email string\n var age int\n err := rows.Scan(&id, &name, &email, &age)\n if err != nil {\n log.Fatal(err)\n }\n fmt.Printf("ID: %d, Name: %s, Email: %s, Alter: %d\\n", id, name, email, age)\n}\n\n// Aktualisieren\n_, err = db.Exec("UPDATE users SET age = $1 WHERE name = $2", 31, "Ivan Petrov")\nif err != nil {\n log.Fatal(err)\n}\nfmt.Println("Alter aktualisiert")\n\n