Как сохранить массив структур - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь сохранить массив структур.
Я пытался:

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,"`
}

Но не работает. Я также пытался сохранить сдвиги как 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 в GenericArray или StringArray?

Когда я Unmarshall данных, я делаю это в следующей структуре Я проверяю данные и после этого хочу сохранить их в базе данных:

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

1 Ответ

1 голос
/ 26 февраля 2020

Ближайший сценарий, который можно увидеть в gorm встроенном тесте структуры , равен

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
}

Как видно, все эти базовые структуры имеют Id, который называется foreign ключ в родительской структуре.

Еще один сценарий, который можно найти в одном из StackOverflow другой ответ .

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"`
}

Пожалуйста, проверьте это по своему усмотрению, так как у меня не настроен горм. Я только сделал часть R & D. Надеюсь, это поможет многим из нас. спасибо

...