Я пытаюсь сохранить вложенную структуру в postgres с помощью gorm, но у меня возникают проблемы с моим типом map[string]*InnerStruct
.
Я хочу сохранить свой тип карты как JSONB в postgres, поэтому я определил сканер / оценщик, как это предлагается в похожих вопросах :
type SomeMapType map[string]*InnerStruct
type StoreStruct struct {
gorm.Model
Id string `gorm:"type:uuid;primary_key"`
AccountID string
SomeMapType SomeMapType `gorm:"column:cache,type:jsonb"`
}
var _ driver.Valuer = SomeMapType{}
var _ sql.Scanner = &SomeMapType{}
func (smt SomeMapType) Value() (driver.Value, error) {
return json.Marshal(smt)
}
func (smt *SomeMapType) Scan(value interface{}) error {
b, ok := value.([]byte)
if !ok {
return errors.New("type assertion to []byte failed")
}
return json.Unmarshal(b, &smt)
}
, но когда я пытаюсь создать такую таблицу:
err := db.
CreateTable(StoreStruct{}).
Table(tableName).Error)
Происходит pani c: panic: invalid sql type SomeMapType (map) for postgres [recovered]
Похоже, это происходит даже до того, как вызываются мои реализации Valuer / Scanner.
Просто невозможно сохранить map
поле в структуре, которую вы хотите сохранить в БД с помощью gorm? Я считаю, что видел примеры, которые, похоже, работают с map[string]interface{}
, поэтому я не уверен, почему мой сценарий отличается?