1 回答
TA贡献1805条经验 获得超9个赞
您编写的代码存在一些问题。避免连接泄漏问题的直接答案是关闭文档中提到rows的迭代器。调用它的正常方式是在语句中:defer
rows, err := db.Query(
"select 1 from things where id = $1",
thing,
)
if err != nil {
return nil, fmt.Errorf("can't select thing (%d): %w", thing, err)
}
defer rows.Close()
found := false
for rows.Next() {
found = true
break
}
其次,由于您只关心单个结果,因此根本没有理由获取多行结果集,这也将隐式解决连接泄漏问题。有关在 Postgres 中检查存在的最快方法的讨论,请参阅这篇文章。如果我们在这里调整:
row, err := db.QueryRow(
"select EXISTS(SELECT 1 from things where id = $1)",
thing,
)
if err != nil {
return nil, fmt.Errorf("can't select thing (%d): %w", thing, err)
}
var found bool
if err := row.Scan(&found); err != nil {
return nil, fmt.Errorf("Failed to scan result: %w", err)
}
- 1 回答
- 0 关注
- 145 浏览
添加回答
举报