首頁 > 後端開發 > Golang > 如何在GORM中有效率地查詢關聯實體?

如何在GORM中有效率地查詢關聯實體?

Susan Sarandon
發布: 2024-12-29 08:56:11
原創
747 人瀏覽過

How to Efficiently Query Associated Entities in GORM?

GORM Golang 中的關聯

在Go 中,利用GORM ORM,在查詢多個相關資訊的實體時會出現一個常見的挑戰。讓我們深入研究一個範例來說明這個問題。

考慮代表城鎮及其相關地點的結構:

type Place struct {
  ID          int
  Name        string
  Town        Town
}

type Town struct {
  ID   int
  Name string
}
登入後複製

假設資料庫包含以下範例資料:

places table towns Table
id name town_id id name
1 Place1 1 1 Town1
2 Place2 1 2 Town2

要檢索所有地點及其對應的城鎮,可以嘗試以下操作查詢:

db := gorm.Open("sqlite3", "./data.db")
defer db.Close()
places := []Place{}
db.Find(&places)
登入後複製

但是,結果將產生:

[{1 Place1 {0 }} {2 Mares Place2 {0 }}]
登入後複製

請注意,缺少相應的城鎮資訊.為了修正這個問題,我們需要將Place 結構中的外鍵指定為TownID:

type Place struct {
  ID          int
  Name        string
  Description string
  TownID      int
  Town        Town
}
登入後複製

要獲得預期結果,可以選擇以下方法:

db.Find(&places)
for i, _ := range places {
    db.Model(places[i]).Related(&places[i].Town)
}
登入後複製

這確實會產生期望的結果,但它會遇到n 1 問題,因為它會為每個位置觸發額外的資料庫查詢。

更多有效的解決方案涉及利用預先載入:

db.Preload("Town").Find(&places)
登入後複製

這種簡潔的方法會產生以下最佳化的資料庫查詢:

SELECT  * FROM "places"
[0.92ms]  SELECT  * FROM "towns"  WHERE ("id" in ('1'))
登入後複製

透過利用預先加載,我們確保在單一中檢索相關的城鎮資訊資料庫查詢,從而優化效能並消除n 1 問題。

以上是如何在GORM中有效率地查詢關聯實體?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板