在 Go 中,GORM 是一種流行的與資料庫互動的 ORM。在 GORM 中使用關聯時,在結構之間建立適當的關係非常重要。考慮以下表示城鎮和地點的結構體:
type Place struct { ID int Name string Town Town } type Town struct { ID int Name string }
這裡,每個城鎮可以有多個地點,而每個地點只屬於一個城鎮。
假設您要查詢所有地點及其相關城鎮資訊。以下是示例數據庫和預期結果:
地點表
id | name | town_id |
---|---|---|
1 | Place1 | 1 |
2 | Place2 | 1 |
城鎮表
id | name |
---|---|
1 | Town1 |
預期結果:
id | name | Town |
---|---|---|
1 | Place1 | Town1 |
2 | Place2 | Town1 |
初始實現嘗試查詢所有地點,但未能包含關聯的城鎮資訊:
db, _ := gorm.Open("sqlite3", "./data.db") defer db.Close() places := []Place{} db.Find(&places) fmt.Println(places)
最佳解決方案是在Find 操作之前使用GORM 的Preload 方法。這確保了相關資料包含在主查詢中,從而無需額外的查詢:
db.Preload("Town").Find(&places)
採用這種方法,只會觸發兩個查詢,顯著提高效能:
查詢日誌:
Time | Query |
---|---|
22.24ms | SELECT * FROM "places" |
0.92ms | SELECT * FROM "towns" WHERE "id" in ('1') |
使用關聯時GORM,正確定義外鍵至關重要。利用預加載,您可以在查詢中有效地包含關聯信息,從而保持可擴展性並優化效能。
以上是GORM 的預先載入功能如何最佳化關聯查詢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!