如何正确扫描 pq 数组?
How to correctly Scan pq arrays?
在 PostgreSQL 数据库中我有一个 table:
| 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 中,我对 table 进行查询,然后尝试使用 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
对于上面的代码。
nil 指针取消引用在 entry
上进行。通过将 entry
从指针更改为值来修复:
for rows.Next() {
var entry Entry // <--- change on this line
... remaining code as in question
}
因为这几个&entry.OrganizationID、&entry.FactorIDS、&entry.CalculationValues而慌了。由于条目是指针类型,您还没有为它初始化内存。如果你想要指针类型的结构,你可以像这样初始化它:
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
}
}
}
在 PostgreSQL 数据库中我有一个 table:
| 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 中,我对 table 进行查询,然后尝试使用 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
对于上面的代码。
nil 指针取消引用在 entry
上进行。通过将 entry
从指针更改为值来修复:
for rows.Next() {
var entry Entry // <--- change on this line
... remaining code as in question
}
因为这几个&entry.OrganizationID、&entry.FactorIDS、&entry.CalculationValues而慌了。由于条目是指针类型,您还没有为它初始化内存。如果你想要指针类型的结构,你可以像这样初始化它:
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
}
}
}