Ich habe folgendes:
type BufferType string
const (
Console BufferType = "console"
Channel BufferType = "channel"
Conversation BufferType = "conversation"
)
type Buffer struct {
Bid int64 `gorm:"primary_key:yes"`
Type BufferType `sql:"not null;type:ENUM('console', 'channel', 'conversation')"`
Name string `sql:"size:255;not null"`
}
Wenn ich db.Save(buffer) versuche, erhalte ich die folgende Fehlermeldung:
sql: converting Exec argument #1's type: unsupported type BufferType, a string)
Wäre es möglich, aufzulösen, dass BufferType wirklich nur eine Zeichenfolge ist, und zu speichern? Ich erhalte ähnliche Fehler, wenn ich versuche, diese Struktur mit db.Find() zu laden.
Nach einigem weiteren Debuggen scheint dieser Fehler aus der Golang-Datenbank/dem SQL-Code zu kommen, und ich habe hier eine Lösung gefunden . Ich musste nur hinzufügen:
func (u *BufferType) Scan(value interface{}) error { *u = BufferType(value.(string)); return nil }
func (u BufferType) Value() (driver.Value, error) { return string(u), nil }
Es ist ein bisschen klobig, aber es hilft der Datenbank, richtig zuzuordnen. Ich könnte hier auch die Fehlerüberprüfung hinzufügen, wenn ich sie brauche.
Ich hatte das gleiche Problem. Die Lösung von @bramp hat mir trotzdem einen Fehler gegeben. Bei mir hat folgendes funktioniert:
func (u *BufferType) Scan(value interface{}) error { *u = BufferType(value.([]byte)); return nil }
func (u BufferType) Value() (driver.Value, error) { return string(u), nil }
Der Unterschied besteht darin, []byte
anstelle von string
. Dieser Stackoverflow-Thread hat mir geholfen: http://stackoverflow.com/a/20582504/2418739
+1 tolle Lösung. Ich wünschte, das wäre in den GORM-Dokumenten.
Hilfreichster Kommentar
Ich hatte das gleiche Problem. Die Lösung von @bramp hat mir trotzdem einen Fehler gegeben. Bei mir hat folgendes funktioniert:
Der Unterschied besteht darin,
[]byte
anstelle vonstring
. Dieser Stackoverflow-Thread hat mir geholfen: http://stackoverflow.com/a/20582504/2418739