【问题标题】:How to correctly Scan pq arrays?如何正确扫描 pq 数组?
【发布时间】:2019-07-29 04:50:19
【问题描述】:

在 PostgreSQL 数据库中,我有一个表:

| ORGANIZATION_ID | FACTOR_IDS   | CALCULATION_VALUES  |
|-----------------|--------------|---------------------|
| 1               | {1,2,3,4,5}  | {0,66.66,50,100,80} |
| 2               | NULL         | NULL                |
| 1               | {6,7,8,9,10} | {0,77.77,60,110,90} |

在 Go 中,我对该表进行查询,然后尝试使用 Scan 方法。不幸的是,我收到一个错误:

Trace: runtime error: invalid memory address or nil pointer dereference

我的代码:

type Entry struct {
    OrganizationID int
    FactorIDS pq.Int64Array
    CalculationValues pq.Float64Array
}

rows, err = database.DBGORM.Raw(`SELECT * FROM ANALYTICS`, ID).Rows()

if err != nil {
    utils.Logger().Println(err)
    return
}

defer rows.Close()

for rows.Next() {
    var entry *Entry

    if err = rows.Scan(&entry.OrganizationID, &entry.FactorIDS, &entry.CalculationValues); err != nil {
        utils.Logger().Println(err) // <- RAISE ERROR
        return
    }

    if entry.FactorIDS != nil {
        for index, value := range factorID {
            // some code here
        }
    }
}

我该如何解决这个问题?

另外,如果我将类型从 pq.Int64Array 更改为 *pq.Int64Array,Go 编译器会给出错误:Cannot range over data *pq.Int64Array 上面的代码。

【问题讨论】:

    标签: postgresql go go-gorm


    【解决方案1】:

    nil 指针取消引用位于entry。通过将 entry 从指针更改为值来修复:

    for rows.Next() {
        var entry Entry  // <--- change on this line
        ... remaining code as in question
    }
    

    【讨论】:

    • 感谢您的回答。就我而言,我决定使用这样的声明:entry := &amp;Entry{}.
    【解决方案2】:

    因为这些 &entry.OrganizationID、&entry.FactorIDS 和 &entry.CalculationValues,它很恐慌。由于 entry 是指针类型,并且您还没有初始化它的内存。如果你想要指针类型的结构,你可以像这样初始化它:

    for rows.Next() {
        entry:=new(Entry)
    
        if err = rows.Scan(&entry.OrganizationID, &entry.FactorIDS, &entry.CalculationValues); err != nil {
            utils.Logger().Println(err) // <- RAISE ERROR
            return
        }
    
        if entry.FactorIDS != nil {
            for index, value := range factorID {
                // some code here
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-17
      相关资源
      最近更新 更多