ORM für Go (Golang): Vergleich und Anwendungsbeispiele

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): Vergleich und Beispiele



Die Entwicklung mit Go (Golang) erfordert oft die Interaktion mit Datenbanken. Anstatt rohe SQL-Abfragen zu schreiben, greifen Entwickler zunehmend auf ORM (Object-Relational Mapping) zurück – Werkzeuge, die die Datenkonvertierung zwischen einer relationalen Datenbank und Sprachobjekten automatisieren. In diesem Artikel analysieren wir die vier beliebtesten ORMs für Go: GORM, Ent, SQLBoiler und Bun. Sie erfahren deren Stärken und Schwächen, sehen Codebeispiele und können eine fundierte Entscheidung für Ihr Projekt treffen.



Warum braucht man ein ORM in Go?

Ein ORM löst mehrere zentrale Aufgaben:

  • Reduzierung von Boilerplate-Code – CRUD-Operationen müssen nicht manuell geschrieben werden.
  • Typsicherheit – Der Go-Compiler prüft die Übereinstimmung der Strukturfelder mit den Tabellenspalten.
  • Schema-Migrationen – Automatische Erstellung und Aktualisierung von Tabellen.
  • Datenbankabstraktion – Wechsel des DBMS (PostgreSQL, MySQL, SQLite) ohne Umschreiben der Abfragen.


1. GORM – Die beliebteste Wahl

GORM ist der De-facto-Standard für ORMs im Go-Ökosystem. Es ist bekannt für seinen umfangreichen Funktionsumfang: automatische Migrationen, Hooks, Methodenverkettung, Unterstützung für Transaktionen und Beziehungen (Has Many, Belongs To, Many2Many).



Codebeispiel mit GORM

package main

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

type User struct { gorm.Model Name string Email string `gorm:"uniqueIndex"`}

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

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

// Einfügen db.Create(&User{Name: "Alice", Email: "alice@example.com"})

// Lesen var user User db.First(&user, 1) // nach Primärschlüssel db.First(&user, "email = ?", "alice@example.com")

// Aktualisieren db.Model(&user).Update("Name", "Bob")

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


Vorteile: riesige Community, umfangreiche Dokumentation, integrierte Unterstützung für Assoziationen und Hooks.

Nachteile: manchmal langsame Leistung bei komplexen Abfragen, magisches Verhalten (z. B. automatische Änderung von Feldern).



2. Ent – Codegenerierung und strenge Typisierung

Ent von Facebook (Meta) ist nicht nur ein ORM, sondern ein komplettes Framework für die Arbeit mit Entitäten. Es generiert Go-Code basierend auf einem in Go-Syntax beschriebenen Schema. Dies bietet maximale Leistung und Typsicherheit.



Codebeispiel mit Ent

// schema/user.gopackage schema

import ( "entgo.io/ent" "entgo.io/ent/schema/field")

type User struct { ent.Schema}

func (User) Fields() []ent.Field { return []ent.Field{ field.String("name"), field.String("email").Unique(), }}

// main.gopackage main

import ( "context" "log"

"entgo.io/ent/dialect/sqlite" "yourproject/ent")

func main() { client, err := ent.Open("sqlite3", "file:ent.db?cache=shared&mode=rwc") if err != nil { log.Fatal(err) } defer client.Close()

ctx := context.Background() // Tabellen erstellen if err := client.Schema.Create(ctx); err != nil { log.Fatal(err) }

// Einfügen u, _ := client.User.Create().SetName("Alice").SetEmail("alice@example.com").Save(ctx)

// Lesen user, _ := client.User.Get(ctx, u.ID) log.Println(user.Name)}


Vorteile: hohe Leistung, vollständige Typisierung, hervorragende Unterstützung für Graph-Abfragen.

Nachteile: steile Lernkurve, Notwendigkeit der Codegenerierung, weniger integrierte Funktionen (z. B. keine Hooks).



3. SQLBoiler –

Empfehlungen