我需要保存[]或具有不同整数值的列表,例如[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中读取此值,并将其与current_date进行比较。
为此,我尝试了:
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),我得到了正确的值,但是我需要遍历该 slice 以将其与今天的日期进行比较。我尝试了很多方法来在循环(dom值)中获取实际值(6),但无济于事。
// 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)
        //      // }
        //  }
        // }
我什至尝试了各种答案的建议,例如thisthisthis
我在这里想念什么?非常感谢您的帮助。
我遇到的一些错误:
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

最佳答案

Golang cannot range over pointer to slice

您正在遍历指向 slice 而不是 slice 的指针。这意味着您将必须首先取消引用变量,然后对其进行循环。签出this example
cannot range over bytes.NewBuffer(s.DateOfMonth) (type *bytes.Buffer)

您不能超出*bytes.Buffer类型。您可以使用Buffer.Bytes()方法访问该类型的字节。签出this example
sql: Scan error on column index 4, name "date_of_month": unsupported Scan, storing driver.Value type []uint8 into type *[]int

从错误的角度来看,我猜这是在您扫描[]int64时使用DateOfMonth类型时发生的。发生此错误的可能性之一是您的数据库将值存储为[]uint8而不是[]int64

Postgres的无效SQL类型DateOfMonth( slice )

在能够成功重现此错误之后,我将尝试更新我的答案。

08-28 04:15