> 백엔드 개발 > Golang > GORM에서 연관된 엔터티를 효율적으로 쿼리하는 방법은 무엇입니까?

GORM에서 연관된 엔터티를 효율적으로 쿼리하는 방법은 무엇입니까?

Susan Sarandon
풀어 주다: 2024-12-29 08:56:11
원래의
748명이 탐색했습니다.

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 문제가 발생합니다.

더 보기 효율적인 솔루션에는 Preloads 활용이 포함됩니다.

db.Preload("Town").Find(&places)
로그인 후 복사

이 간결한 접근 방식으로 다음과 같은 최적화된 데이터베이스 쿼리가 생성됩니다.

SELECT  * FROM "places"
[0.92ms]  SELECT  * FROM "towns"  WHERE ("id" in ('1'))
로그인 후 복사

Preloads를 활용하면 관련 도시 정보를 단일 검색에서 검색할 수 있습니다. 데이터베이스 쿼리를 수행하여 성능을 최적화하고 n1 문제를 제거합니다.

위 내용은 GORM에서 연관된 엔터티를 효율적으로 쿼리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿