ORM für Go (Golang): Vergleich und Beispiele beliebter Bibliotheken

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

ORM für Go (Golang): Überblick, Vergleich und praktische Beispiele



Go (Golang) ist bekannt für seine Leistung und Einfachheit, aber die Arbeit mit Datenbanken erfordert oft das Schreiben von viel Boilerplate-SQL-Code. ORM-Bibliotheken (Object-Relational Mapping) sollen die Interaktion mit der Datenbank vereinfachen, indem sie die Abbildung von Go-Strukturen auf Tabellen automatisieren. In diesem Artikel betrachten wir die drei beliebtesten ORMs für Go: GORM, Ent und SQLBoiler, vergleichen sie anhand wichtiger Parameter und zeigen praktische Beispiele.



1. GORM — das beliebteste ORM für Go



GORM ist ein voll funktionsfähiges ORM mit einer aktiven Community und einer Vielzahl von Funktionen: Migrationen, Hooks, Preloading von Beziehungen, Transaktionen und vieles mehr. Es arbeitet nach dem Prinzip "Convention over Configuration" und unterstützt die gängigsten DBMS (PostgreSQL, MySQL, SQLite).



Vorteile:

  • Schneller Einstieg: minimale Konfiguration, automatische Tabellenerstellung.
  • Reichhaltiges Ökosystem: Plugins, Logger, Validatoren.
  • Unterstützung von Assoziationen (Belongs To, Has Many, Many2Many).


Nachteile:

  • Mittelmäßige Leistung aufgrund von Reflection und dynamischer SQL-Generierung.
  • Schwierigkeiten bei der Optimierung komplexer Abfragen (N+1-Problem).


Beispiel für die Verwendung von GORM:

package main

import ( "gorm.io/driver/sqlite" "gorm.io/gorm")

type User struct { ID uint `gorm:"primaryKey"` Name string `gorm:"size:100"` Age int}

func main() { // Verbindung zu SQLite db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{}) if err != nil { panic("failed to connect database") }

// Automigration — Tabellenerstellung db.AutoMigrate(&User{})

// Datensatz erstellen db.Create(&User{Name: "Ivan", Age: 30})

// Lesen var user User db.First(&user, 1) // nach ID suchen db.First(&user, "name = ?", "Ivan") // nach Bedingung suchen

// Aktualisieren db.Model(&user).Update("Age", 31)

// Löschen db.Delete(&user)}


2. Ent — ORM von Facebook mit Codegenerierung



Ent ist ein modernes ORM, das typisierten Go-Code basierend auf einem in Go-Strukturen beschriebenen Datenschema generiert. Es bietet strenge Typisierung, hervorragende Leistung und eine leistungsstarke Graph-API für Abfragen. Ent wird aktiv weiterentwickelt und in großen Projekten eingesetzt (z. B. bei Facebook selbst).



Vorteile:

  • Codegenerierung: Fehler zur Kompilierzeit, nicht zur Laufzeit.
  • Hohe Leistung durch statisches SQL.
  • Bequeme API zum Erstellen komplexer Abfragen mit Filterung und Sortierung.


Nachteile:

  • Notwendigkeit der Installation eines CLI-Tools und der Codegenerierung.
  • Steilere Lernkurve im Vergleich zu GORM.


Beispiel für die Verwendung von Ent:

package main

import ( "context" "log"

"entgo.io/ent/dialect/sqlite" "github.com/yourproject/ent" "github.com/yourproject/ent/user")

func main() { // Verbindung zu SQLite client, err := ent.Open("sqlite3", "file:ent.db?cache=shared&_fk=1") if err != nil { log.Fatalf("failed opening connection to sqlite: %v", err) } defer client.Close()

// Automigration if err := client.Schema.Create(context.Background()); err != nil { log.Fatalf("failed creating schema resources: %v", err) }

// Benutzer erstellen createdUser, err := client.User.Create(). SetName("Peter"). SetAge(25). Save(context.Background()) if err != nil { log.Fatalf("failed creating user: %v", err) }

// Abfrage mit Filterung users, err := client.User.Q

Empfehlungen