Persistenz für Go – ohne eine Zeile SQL Open Source
ORM++ ist unser model-first Persistenz-Modul für Go: Sie deklarieren Ihre Modelle als Structs mit Tags, ORM++ übernimmt den Rest – vom Schema über Abfragen bis zu Event Sourcing und Migrationen.
Modelle deklarieren statt Datenbank programmieren
Der Ansatz ist konsequent model-first: Ein Go-Struct mit Tags beschreibt, was gespeichert wird – Tabellen, Indizes, Systemtabellen und Worker leitet ORM++ daraus ab. Ob ein Modell klassisch als CRUD-Tabelle oder als event-sourced Aggregat mit vollständiger Historie geführt wird, ist eine einzige Registrierungs-Entscheidung.
Codebeispiel
import orm "gitlab.techeve.de/orm-plus-plus/orm-plus-plus"
type Todo struct {
ID orm.ID `orm:"pk"`
Title string `orm:"index"`
Done bool
}
db, err := orm.Open(orm.SQLite("./todo.db"))
orm.Register[Todo](db, orm.CRUD())
db.Migrate(ctx)
db.StartWorkers(ctx)
ctx = orm.WithTenant(ctx, orm.SingleTenant)
todos := orm.Repo[Todo](db)
todos.Insert(ctx, &Todo{Title: "ORM++ bauen"})
open, _ := todos.Query(ctx).Where(orm.Eq("Done", false)).All() Eigenschaften von ORM++
CRUD und Event Sourcing – in einer Library
Klassische Create/Read/Update/Delete-Modelle und event-getriebene Aggregate leben nebeneinander in derselben Anwendung: mit CloudEvents, Snapshots und Archivierung, wo Historie zählt – und schlichten Tabellen, wo nicht.
Eine Codebasis, drei Datenbanken
Dieselbe Anwendung läuft unverändert auf SQLite, PostgreSQL und YugabyteDB. Vom Ein-Datei-Prototyp bis zum verteilten Cluster ändert sich am Anwendungscode nichts.
Multi-Tenancy eingebaut
Mandanten- und Geo-Scoping sind strukturell im Datenmodell verankert statt nachträglich angeflanscht: Ohne Tenant-Kontext läuft keine Abfrage – Datenlecks zwischen Mandanten werden zum Compilezeit-Thema.
Migrationen ohne Stillstand
Alte und neue Modellversion laufen parallel, bis alles migriert ist – Schema-Änderungen brauchen kein Wartungsfenster und keinen Big-Bang-Umbau.
Doku & Quelle
Einführung, Schnellstart und Beispiele finden Sie in der Dokumentation – den Code im GitLab-Repository des Projekts.