【问题标题】:How to save array of structs如何保存结构数组
【发布时间】:2020-05-07 07:04:32
【问题描述】:

我正在尝试保存一个结构数组。
我试过了:

type ShiftValue struct {
    Hour   uint8 `json:"hour"`
    Minute uint8 `json:"minute"`
}

type Shift struct {
    Start ShiftValue `json:"start"`
    End   ShiftValue `json:"end"`
}

type Config struct {
    ID                        uuid.UUID       `gorm:"type:uuid;primary_key;index;" json:"id"`
    CreatedAt                 time.Time       `json:"created_at"`
    UpdatedAt                 time.Time       `json:"updated_at"`
    DeletedAt                 *time.Time      `json:"deleted_at,omitempty"`
    Shifts                    []Shift         `gorm:"type:varchar(100)[];" json:"shifts,"`
}

但是不工作。我还尝试将 Shifts 保存为 pq.StringArray:

type Config struct {
    ID                        uuid.UUID       `gorm:"type:uuid;primary_key;index;" json:"id"`
    CreatedAt                 time.Time       `json:"created_at"`
    UpdatedAt                 time.Time       `json:"updated_at"`
    DeletedAt                 *time.Time      `json:"deleted_at,omitempty"`
    Shifts                    pq.StringArray  `gorm:"type:varchar(100)[];" json:"shifts,"`
}

这有点工作,但我不知道如何将Shift 的一部分转换为StringArray
我应该使用GenericArrray吗?
如何将Slice 转换为GenericArrayStringArray

当我Unmarshall 数据时,我在以下结构中执行此操作,验证数据,然后将其保存到数据库:

type ConfigUpdate struct {
    Shifts                    []Shift         `json:"shifts,"`
}

【问题讨论】:

    标签: postgresql go go-gorm


    【解决方案1】:

    在gormembedded struct test中可以看到最近的场景是

    package gorm_test
    
    import "testing"
    
    type BasePost struct {
        Id    int64
        Title string
        URL   string
    }
    
    type Author struct {
        ID    string
        Name  string
        Email string
    }
    
    type HNPost struct {
        BasePost
        Author  `gorm:"embedded_prefix:user_"` // Embedded struct
        Upvotes int32
    }
    
    type EngadgetPost struct {
        BasePost BasePost `gorm:"embedded"`
        Author   Author   `gorm:"embedded;embedded_prefix:author_"` // Embedded struct
        ImageUrl string
    }
    
    

    可以看出,所有这些 Base Struct 在父结构中都有Id 被称为foreign 键。

    可以在 StackOverflow another answer 之一中找到另一种情况。

    type Children struct {
        Lat float64
        Lng float64
    }
    
    type ChildArray []Children
    
    func (sla *ChildArray) Scan(src interface{}) error {
        return json.Unmarshal(src.([]byte), &sla)
    }
    
    func (sla ChildArray) Value() (driver.Value, error) {
        val, err := json.Marshal(sla)
        return string(val), err
    }
    
    type Parent struct {
        *gorm.Model    
        Childrens ChildArray `gorm:"column:childrens;type:longtext"`
    }
    

    请自行验证,因为我没有设置 gorm。我只是做了研发部分。我希望,它会帮助我们中的许多人。谢谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-15
      • 2017-06-10
      • 2011-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-01
      相关资源
      最近更新 更多