亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在同一個函數中對 Postgres 的多個查詢

在同一個函數中對 Postgres 的多個查詢

Go
ABOUTYOU 2023-01-03 14:18:41
我是 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)}我有幾個關于此代碼的問題(任何改進和最佳實踐將不勝感激)defer rows.Close()在這種情況下,Go 能正確處理嗎?我的意思是我rows稍后會在代碼中重新分配變量,所以編譯器會跟蹤這兩個變量并在函數結束時正確關閉嗎?可以重用id共享變量還是應該在循環內迭代時重新聲明它rows.Next()?在一個處理程序中進行更多查詢的更好方法是什么?我應該有某種Writer接受查詢和切片并用檢索到的 ID 填充它的東西嗎?謝謝。
查看完整描述

1 回答

?
慕容708150

TA貢獻1831條經驗 獲得超4個贊

我從未與go-pg圖書館合作過,我的回答主要集中在其他通用的東西上,并不特定于 golang 或 go-pg。


不管rowshere 在兩個查詢之間共享時具有相同的引用(所以一個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 文檔,了解有關如何改進查詢的更多詳細信息。


查看完整回答
反對 回復 2023-01-03
  • 1 回答
  • 0 關注
  • 114 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號