Eu tenho o seguinte:
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"`
}
Quando tento db.Save (buffer), recebo o seguinte erro:
sql: converting Exec argument #1's type: unsupported type BufferType, a string)
Seria possível resolver que BufferType é realmente apenas uma string e salvar? Recebo erros semelhantes se tento carregar esta estrutura com db.Find ()
Depois de mais alguma depuração, esse erro parece estar saindo do código do banco de dados / sql golang, e eu encontrei uma solução aqui . Eu só precisava adicionar:
func (u *BufferType) Scan(value interface{}) error { *u = BufferType(value.(string)); return nil }
func (u BufferType) Value() (driver.Value, error) { return string(u), nil }
É um pouco desajeitado, mas ajuda o banco de dados a saber como mapear corretamente. Eu também poderia adicionar verificação de erro aqui, se necessário.
Eu tive o mesmo problema. A solução do @bramp ainda me deu um erro. O seguinte funcionou para mim:
func (u *BufferType) Scan(value interface{}) error { *u = BufferType(value.([]byte)); return nil }
func (u BufferType) Value() (driver.Value, error) { return string(u), nil }
A diferença é usar []byte
vez de string
. Este thread stackoverflow me ajudou: http://stackoverflow.com/a/20582504/2418739
+1 ótima solução. Eu gostaria que isso estivesse nos documentos do GORM.
Comentários muito úteis
Eu tive o mesmo problema. A solução do @bramp ainda me deu um erro. O seguinte funcionou para mim:
A diferença é usar
[]byte
vez destring
. Este thread stackoverflow me ajudou: http://stackoverflow.com/a/20582504/2418739