Golang Горм, работающий со срезами и postgres 'поле jsob - PullRequest
0 голосов
/ 06 августа 2020

У меня есть требование сохранить либо [], либо список с разными целочисленными значениями, например [1, 7, 8]. Эти значения могут быть любыми между 1-31.

Моя структура для этого поля (DateOfMonth):

type Subscription struct {
    gorm.Model
    Enabled            bool    `gorm:"DEFAULT:True"`
    Deleted            bool    `gorm:"DEFAULT:False"`
    UserID             uint    `gorm:"not null"`
    Cap                int     `gorm:"DEFAULT:-1"`
    DateOfMonth        []int64 `gorm:"type:json default '[]'::json"`
}

Теперь мне нужно прочитать это значение в API и сравнить его с текущая_дата.

Для этого я пробовал:

type Result struct {
        ID               uint
        Email            string
        UniqueIdentifier string
        Cap              int
        DateOfMonth      []uint8
    }
    var subscriptions []Result
    if err := db.Table("users").Select("users.id, users.email, users.unique_identifier, subscriptions.cap, subscriptions.date_of_month").Joins("join subscriptions on users.id = subscriptions.user_id").Where("subscriptions.subscription_type_id=? and users.is_verified=? and subscriptions.enabled=?", subscription_type_id, true, true).Find(&subscriptions).Error; err != nil {
        c.JSON(http.StatusNotFound, gin.H{"error": true, "reason": "Subscribers not found!", "code": http.StatusBadRequest, "status": "failure"})
        return
    }

Если я изменю DateOfMonth []uint8 на DateOfMonth []int64, это даст ошибку. Значение, которое я получаю в этом поле, представляет собой список байтовых значений. Например, [] -> [91 93] и [6] -> [91 54 93]

Если да, bytes.NewBuffer(s.DateOfMonth), Я получаю правильное значение, но затем мне нужно перебрать этот фрагмент, чтобы сравнить его с сегодняшней датой. Я пробовал много способов получить фактическое значение (6) в l oop (значение dom), но безрезультатно.

// if len(s.DateOfMonth) > 0 {
        //  // date_of_month_new := binary.BigEndian.Uint64(date_of_month)
        //  todays_date_of_month := time.Now().Day()
        //  fmt.Println(todays_date_of_month) //, date_of_month, reflect.TypeOf(date_of_month))
        //  for _, dom := range s.DateOfMonth {
        //      fmt.Println("help", reflect.TypeOf(dom), dom, todays_date_of_month)
        //      // if dom == todays_date_of_month {
        //      //  fmt.Println("matching", dom, todays_date_of_month)
        //      // }
        //  }
        // }

Я даже пробовал предложения из различных ответов, например это , это , это

Что мне здесь не хватает? Мы будем очень благодарны за вашу помощь.

Некоторые из полученных мной ошибок:

invalid sql type DateOfMonth (slice) for postgres
Golang cannot range over pointer to slice
cannot range over bytes.NewBuffer(s.DateOfMonth) (type *bytes.Buffer)
sql: Scan error on column index 4, name "date_of_month": unsupported Scan, storing driver.Value type []uint8 into type *[]int 
...