일부 GORM 팁 및 참고 사항

9027 단어 gormgo
몇 가지 팁이 있으며 GROM의 메모는 하루 종일 노트북 앞에서 디버깅을 방해할 수 있습니다.

0 값을 업데이트하지 않습니다.




type User struct {
  ID int
  Age int
}
// if user.Age is 6 in database originally 
user.Age = 0
db.Updates(&user)


연령이 업데이트되지 않은 것을 확인할 수 있습니다.

해결 방법




db.Model(&user).Select("*").Omit("Role").Update(User{Role: "admin", Age: 0})
db.Model(&user).Update(map[string]interface{}{"role": 0})


후드 아래에 무엇이 있습니까?



첫째, golang의 대부분의 제네릭은 reflect 패키지에 의존합니다. Gorm은 필드를 업데이트해야 하는지 확인하기 위해 reflect.IsZreo()을 사용합니다. source code
둘째, 0는 interface{} 유형에 대한 0 값이 아니라 int 유형에 대한 0 값입니다. 그 이유는 그 아래의 interface{}가 객체의 유형과 참조를 저장하는 구조체에 대한 포인터와 같기 때문입니다. nil는 interface{}의 0 값입니다.

따라서 Gorm은 Select(fields...) 또는 map[stirng]interface{}를 사용하여 업데이트할 필드를 명시적으로 선언할 수 있습니다.

찾을 수 없음



레코드를 찾을 수 없는 경우 db.Find() 함수에서 ErrNotFound가 발생하지 않습니다.

WithContext



WithContext를 사용하면 업스트림 ctx 시간이 초과되거나 취소되면 쿼리도 취소될 수 있습니다. https://gorm.io/docs/session.html#Context

timeoutCtx, _ := context.WithTimeout(context.Background(), time.Second)  

tx := db.WithContext(timeoutCtx)
tx.First(&user) // query with context timeoutCtx  
tx.Model(&user).Update("role", "admin") // update with context timeoutCtx

WithContext는 GORM의 NewSession 함수 유형으로 동일한 컨텍스트에서 안전하게 재사용할 수 있습니다.
https://gorm.io/docs/method_chaining.html#New-Session-Method

메소드 체이닝



메소드 체이닝은 때때로 코드를 더 읽기 쉽고 재사용 가능하게 만들 수 있습니다. 포인터 값을 사용하여 선택적 쿼리 매개변수를 가질 수 있습니다.

type Filter struct {
    IDs        []int
    Type       *OrderType
    UserID     *string
}

func (r *Repository) QueryOrders(ctx context.Context, filter Filter) (orders []repository.Order, err error) {
    db := r.db.WithContext(ctx)
    if filter.UserID != nil {
        db = db.Where("user_id = ?", filter.UserID)
    }
    if len(filter.IDs) > 0 {
        db = db.Where("id in (?)", filter.IDs)
    }
    if filter.Type != nil {
        db = db.Where("type = ?", filter.Type)
    }
    if err := db.Find(&orders).Error; err != nil {
        return nil, err
    }
}


하지만 Where는 GORM에서 Chaining Method이며 Where()에서 반환된 db는 재사용하기에 안전하지 않습니다.

좋은 웹페이지 즐겨찾기