[英]Multiple queries to Postgres within the same function
我是Go新手,很抱歉提前提出愚蠢的问题!
我正在使用 Gin 框架并希望在同一个处理程序中对数据库进行多个查询( database/sql
+ lib/pq
)
userIds := []int{}
bookIds := []int{}
var id int
/* Handling first query here */
rows, err := pgClient.Query(getUserIdsQuery)
defer rows.Close()
if err != nil {
return
}
for rows.Next() {
err := rows.Scan(&id)
if err != nil {
return
}
userIds = append(userIds, id)
}
/* Handling second query here */
rows, err = pgClient.Query(getBookIdsQuery)
defer rows.Close()
if err != nil {
return
}
for rows.Next() {
err := rows.Scan(&id)
if err != nil {
return
}
bookIds = append(bookIds, id)
}
我对此代码有几个问题(任何改进和最佳实践将不胜感激)
在这种情况下,Go 是否正确处理defer rows.Close()
? 我的意思是我稍后在代码中重新分配了rows
变量,所以编译器会跟踪两者并在函数结束时正确关闭吗?
可以重用id
shared var 还是应该在rows.Next()
循环中迭代时重新声明它?
在一个处理程序中拥有更多查询的更好方法是什么? 我应该有某种Writer
接受查询和切片并用检索到的 id 填充它吗?
谢谢。
我从来没有使用过go-pg
库,我的回答主要集中在其他东西上,它们是通用的,并不特定于 golang 或 go-pg。
rows
2 个查询之间共享时具有相同的引用(因此一个rows.Close()
调用就足够了,除非库有一些特殊的实现),定义两个变量更清晰,例如userRows
和bookRows
。go-pg
,但我相信你不需要遍历行并手动扫描所有行的 id,我相信 lib 提供了一些这样的 API(基于快速查看文档): userIds := []int{} err := pgClient.Query(&userIds, "select id from users where ...", args...)
// repo layer func getUserIds(args whatever) ([]int, err) {...} // these can be exposed, based on your packaging logic func getBookIds(args whatever) ([]int, err) {...} // service layer, or wherever you want to aggregate both queries func getUserAndBookIds() ([]int, []int, err) { userIds, err := getUserIds(...) // potential error handling bookIds, err := getBookIds(...) // potential error handling return userIds, bookIds, nil // you have done err handling earlier }
我认为这段代码更容易阅读/维护。 您不会面临变量重新分配和其他问题。您可以查看go-pg 文档以获取有关如何改进查询的更多详细信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.