TL; DR: Hat jemand einen Service mit Golang + Protobuf + SQL erstellt? Wenn Sie eine ORM (oder ORM-ähnliche Bibliothek) verwendet haben, welche?Welches ORM verwenden Sie für Golang-Dienste, die ProtoBuf verwenden, um Daten zu serialisieren?
Lesen für mehr Kontext auf:
ich einen Dienst in golang bauen, die protobuf Daten zur Serialisierung verwendet. Daher werden alle meine Typen und API-Aufrufe in .proto-Dateien definiert und dann wird Go-Code mit Protokoll generiert.
Ich möchte ein ORM verwenden, um Daten in MySQL zu persistieren. Ich google herum und fand Gorm, Gorp und eine Reihe anderer Bibliotheken. Scheint zu sein, dass eine Art von Tag oder Annotation in Ihrer Struktur ein übliches Muster für diese Bibliotheken ist.
Beispiel aus dem Gorp docs:
type Post struct {
// db tag lets you specify the column name if it differs from the struct field
Id int64 `db:"post_id"`
Created int64
Title string `db:",size:50"` // Column size set to 50
Body string `db:"article_body,size:1024"` // Set both column name and size
}
Aus der gorm docs:
type Profile struct {
gorm.Model
Name string
}
type User struct {
gorm.Model
Profile Profile `gorm:"ForeignKey:ProfileRefer"` // use ProfileRefer as foreign key
ProfileRefer int
}
Also versuchte ich zu sehen, ob es eine Möglichkeit gibt, diese Anmerkungen auf die Nachrichten in meiner .proto Datei hinzuzufügen, und gefunden this github issue sagen, dass dies nicht unterstützt wird.
So komme ich zu Stack Overflow für Beratung. Sicher gibt es jemanden da draußen, der Protobufs in Golang mit SQL benutzt, oder? Und mit einem ORM? Also welche benutzt du?
Ich schlage vor, mit Anmerkungen versehen Sie besser dran, auf lange Sicht sein, wenn Sie Ihre Netzwerkprotokoll und Datenbankmodell getrennt halten. Ich benutze Sparsamkeit (im Prinzip das gleiche wie Protobuf) und SQL für die Speicherung in einem meiner Projekte. Indem ich sie getrennt aufbewahre, kann ich mein Sparsamkeitsprotokoll so schreiben, wie es für die Netzwerkkommunikation nützlich wäre, und meine Datenbank so halten, wie es nützlich ist, die Daten tatsächlich zu speichern und auf sie zuzugreifen. Ich könnte einen ändern, ohne den anderen zu berühren. Es scheint vielleicht mehr Arbeit zu sein, aber es wird ernsthafte Probleme in der Zukunft verhindern. – creker
Also dachte ich über eine separate Gruppe von Strukturen für die Verwendung innerhalb des Dienstes und dann nur mit einem OL ORM, um die Objekte in meinem SQL-Backend persistent. Aber ich müsste zwei getrennte Objektgruppen verwalten und sie synchron halten. Ich würde das lieber nicht tun. Logischerweise sind die gleichen Objekte, die in meinen Protobuf-Nachrichten existieren, die Objekte, die ich im gesamten Dienst bearbeiten und in der Datenbank speichern möchte. –
Ich würde Sparsamkeit vorschlagen ... –