簡體   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