繁体   English   中英

在同一函数中对 Postgres 的多个查询

[英]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)
}

我对此代码有几个问题(任何改进和最佳实践将不胜感激)

  1. 在这种情况下,Go 是否正确处理defer rows.Close() 我的意思是我稍后在代码中重新分配了rows变量,所以编译器会跟踪两者并在函数结束时正确关闭吗?

  2. 可以重用id shared var 还是应该在rows.Next()循环中迭代时重新声明它?

  3. 在一个处理程序中拥有更多查询的更好方法是什么? 我应该有某种Writer接受查询和切片并用检索到的 id 填充它吗?

谢谢。

我从来没有使用过go-pg库,我的回答主要集中在其他东西上,它们是通用的,并不特定于 golang 或 go-pg。

    1. 尽管此处的rows 2 个查询之间共享时具有相同的引用(因此一个rows.Close()调用就足够了,除非库有一些特殊的实现),定义两个变量更清晰,例如userRowsbookRows
    1. 虽然我已经说过我没有使用go-pg ,但我相信你不需要遍历行并手动扫描所有行的 id,我相信 lib 提供了一些这样的 API(基于快速查看文档):
     userIds := []int{} err := pgClient.Query(&userIds, "select id from users where ...", args...)
    1. 关于您的第二个问题,这取决于您所说的“确定”是什么意思。 由于您进行了一些同步迭代,我认为这不会导致错误,但是就编码风格而言,就个人而言,我不会这样做。
    1. 我认为在您的情况下最好的做法是:
     // 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM