Go, pgx: SELECT query returns 只有一行
Go, pgx: SELECT query returns only one row
Golang,pgx:
我正在尝试从 t_example(当前 20 项)中获取所有行,但由于某种原因只有一个 returns(第一个)。我尝试在第一次迭代后调试 rows.Next() returns false。
你能帮我出出主意吗?
我是新手,但我已经尝试在这里提前找到类似的案例:)
我的代码:
func (ts *exampleStorage) GetAll() *[]Example {
q := `SELECT id, name FROM t_example`
rows := ts.client.Query(context.Background(), q)
example := make([]Example, 0)
for rows.Next() {
var ex Example
rows.Scan(&ex.Id, &ex.Name)
example = append(example, ex)
}
return &example
}
您的代码不检查错误:
row.Scan(&ex.Id, &ex.Name)
可能 return 一个错误(并且,在 pgx
实现中,这个错误对于 rows
迭代是致命的):
err := rows.Scan(&ex.Id, &ex.Name)
if err != nil {
fmt.Printf("*** rows.Scan error: %s", err)
return nil, err
}
sql.Rows / pgx.Rows
错误检查有一个陷阱:您应该检查是否在 退出 循环后 for rows.Next() {
发生错误:
for rows.Next() {
...
}
// check rows.Err() after the last rows.Next() :
if err := rows.Err(); err != nil {
// on top of errors triggered by bad conditions on the 'rows.Scan()' call,
// there could also be some bad things like a truncated response because
// of some network error, etc ...
fmt.Printf("*** iteration error: %s", err)
return nil, err
}
return example, nil
旁注:在绝大多数情况下,您不希望 return 指向切片的指针(例如:*[]Example
)但是一片(例如:[]Example
)
Golang,pgx: 我正在尝试从 t_example(当前 20 项)中获取所有行,但由于某种原因只有一个 returns(第一个)。我尝试在第一次迭代后调试 rows.Next() returns false。 你能帮我出出主意吗?
我是新手,但我已经尝试在这里提前找到类似的案例:)
我的代码:
func (ts *exampleStorage) GetAll() *[]Example {
q := `SELECT id, name FROM t_example`
rows := ts.client.Query(context.Background(), q)
example := make([]Example, 0)
for rows.Next() {
var ex Example
rows.Scan(&ex.Id, &ex.Name)
example = append(example, ex)
}
return &example
}
您的代码不检查错误:
row.Scan(&ex.Id, &ex.Name)
可能 return 一个错误(并且,在pgx
实现中,这个错误对于rows
迭代是致命的):
err := rows.Scan(&ex.Id, &ex.Name)
if err != nil {
fmt.Printf("*** rows.Scan error: %s", err)
return nil, err
}
sql.Rows / pgx.Rows
错误检查有一个陷阱:您应该检查是否在 退出 循环后for rows.Next() {
发生错误:
for rows.Next() {
...
}
// check rows.Err() after the last rows.Next() :
if err := rows.Err(); err != nil {
// on top of errors triggered by bad conditions on the 'rows.Scan()' call,
// there could also be some bad things like a truncated response because
// of some network error, etc ...
fmt.Printf("*** iteration error: %s", err)
return nil, err
}
return example, nil
旁注:在绝大多数情况下,您不希望 return 指向切片的指针(例如:*[]Example
)但是一片(例如:[]Example
)