Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menyoal Entiti Bersekutu dengan Cekap dalam GORM?

Bagaimana untuk Menyoal Entiti Bersekutu dengan Cekap dalam GORM?

Susan Sarandon
Susan Sarandonasal
2024-12-29 08:56:11765semak imbas

How to Efficiently Query Associated Entities in GORM?

Persatuan dalam GORM Golang

Dalam Go, menggunakan GORM ORM, cabaran biasa timbul apabila menanyakan beberapa entiti dengan maklumat yang berkaitan. Mari kita teliti contoh untuk menggambarkan isu ini.

Pertimbangkan struktur yang mewakili bandar dan tempat yang berkaitan dengannya:

type Place struct {
  ID          int
  Name        string
  Town        Town
}

type Town struct {
  ID   int
  Name string
}

Andaikan pangkalan data dengan sampel data berikut:

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

Untuk mendapatkan semula semua tempat bersama dengan bandar yang sepadan, seseorang mungkin mencuba perkara berikut pertanyaan:

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

Walau bagaimanapun, hasilnya akan menghasilkan:

[{1 Place1 {0 }} {2 Mares Place2 {0 }}]

Perhatikan bahawa maklumat bandar yang sepadan tiada. Untuk membetulkannya, kita perlu menentukan kunci asing dalam struct Tempat sebagai TownID:

type Place struct {
  ID          int
  Name        string
  Description string
  TownID      int
  Town        Town
}

Untuk mendapatkan hasil yang diharapkan, seseorang boleh memilih pendekatan berikut:

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

Ini sememangnya akan menghasilkan hasil yang diingini, tetapi ia mengalami masalah n 1, kerana ia mencetuskan pertanyaan pangkalan data tambahan untuk setiap tempat.

Selengkapnya penyelesaian yang cekap melibatkan penggunaan Pramuat:

db.Preload("Town").Find(&places)

Pendekatan ringkas ini menghasilkan pertanyaan pangkalan data yang dioptimumkan berikut:

SELECT  * FROM "places"
[0.92ms]  SELECT  * FROM "towns"  WHERE ("id" in ('1'))

Dengan menggunakan Pramuat, kami memastikan bahawa maklumat bandar yang berkaitan diperolehi dalam satu pertanyaan pangkalan data, dengan itu mengoptimumkan prestasi dan menghapuskan masalah n 1.

Atas ialah kandungan terperinci Bagaimana untuk Menyoal Entiti Bersekutu dengan Cekap dalam GORM?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn