[英]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.