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 문제가 발생합니다.
더 보기 효율적인 솔루션에는 Preloads 활용이 포함됩니다.
db.Preload("Town").Find(&places)
이 간결한 접근 방식으로 다음과 같은 최적화된 데이터베이스 쿼리가 생성됩니다.
SELECT * FROM "places" [0.92ms] SELECT * FROM "towns" WHERE ("id" in ('1'))
Preloads를 활용하면 관련 도시 정보를 단일 검색에서 검색할 수 있습니다. 데이터베이스 쿼리를 수행하여 성능을 최적화하고 n1 문제를 제거합니다.
위 내용은 GORM에서 연관된 엔터티를 효율적으로 쿼리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!