In Go ist GORM ein beliebtes ORM für die Interaktion mit Datenbanken. Bei der Arbeit mit Assoziationen in GORM ist es wichtig, die richtigen Beziehungen zwischen Strukturen herzustellen. Betrachten Sie die folgenden Strukturen, die eine Stadt und einen Ort darstellen:
type Place struct { ID int Name string Town Town } type Town struct { ID int Name string }
Hier kann jede Stadt mehrere Orte haben, während jeder Ort nur zu einer Stadt gehört.
Angenommen, Sie möchten alle Orte abfragen und die zugehörigen Stadtinformationen. Nachfolgend finden Sie eine Beispieldatenbank und das erwartete Ergebnis:
Ortstabelle
id | name | town_id |
---|---|---|
1 | Place1 | 1 |
2 | Place2 | 1 |
Städtetabelle
id | name |
---|---|
1 | Town1 |
Erwartetes Ergebnis:
id | name | Town |
---|---|---|
1 | Place1 | Town1 |
2 | Place2 | Town1 |
Die anfängliche Implementierung versucht, alle Orte abzufragen, schließt jedoch keine zugehörigen Ortsinformationen ein:
db, _ := gorm.Open("sqlite3", "./data.db") defer db.Close() places := []Place{} db.Find(&places) fmt.Println(places)
Die optimale Lösung besteht darin, die Preload-Methode von GORM vor dem zu verwenden Betrieb finden. Dadurch wird sichergestellt, dass verwandte Daten in der Hauptabfrage enthalten sind, sodass keine zusätzlichen Abfragen erforderlich sind:
db.Preload("Town").Find(&places)
Bei diesem Ansatz werden nur zwei Abfragen ausgelöst, was die Leistung erheblich verbessert:
Abfrageprotokoll:
Time | Query |
---|---|
22.24ms | SELECT * FROM "places" |
0.92ms | SELECT * FROM "towns" WHERE "id" in ('1') |
Bei der Arbeit mit Assoziationen in GORM ist es von entscheidender Bedeutung Fremdschlüssel richtig definieren. Durch die Verwendung von Preload können Sie zugehörige Informationen effizient in Ihre Abfragen einbeziehen und so die Skalierbarkeit bewahren und die Leistung optimieren.
Das obige ist der detaillierte Inhalt vonWie kann die Vorladefunktion von GORM Abfragen mit Assoziationen optimieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!