неверный sql тип (карта) для postgres - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь сохранить вложенную структуру в 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{}, поэтому я не уверен, почему мой сценарий отличается?

1 Ответ

0 голосов
/ 07 августа 2020

Моя проблема заключалась не в включении аннотации тега типа SQL.

Внесение изменений ниже устранило мою проблему:

type StoreStruct struct {
    gorm.Model
    Id               string `gorm:"type:uuid;primary_key"`
    AccountID        string
    SomeMapType      SomeMapType `gorm:"column:cache" sql:"type:jsonb"`
}
...