일부 GORM 팁 및 참고 사항
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는 재사용하기에 안전하지 않습니다.
Reference
이 문제에 관하여(일부 GORM 팁 및 참고 사항), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/daniel1in/some-gorm-tips-and-notes-3lm2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)