grom , go 는 쓰면 쓸수록 쓰레기 같다...
many2many 관계를 a, a-b ,b 다대다 관계에서 쓰는건데,
create는 문제없이 잘 되는데, update 가 문제다 ..
if err := r.DB().Session(&gorm.Session{FullSaveAssociations: false}).Omit("Image").Updates(banner).Error; err != nil {
logger.Error(gormhelpers.ErrUpdateRecord, err)
return gormhelpers.ErrUpdateRecord
}
if banner.Image != nil {
// Update associated images using Association
if err := r.DB().Model(banner).Association("Image").Replace(banner.Image); err != nil {
logger.Error(gormhelpers.ErrUpdateRecord, err)
return gormhelpers.ErrUpdateRecord
}
}
위 코드가 최종본이고 ..
https://gorm.io/docs/associations.html#Select-x2F-Omit-Association-fields
공식문서보고 해결이 잘 안된다 욕나온다.. ㅅㅂ
우선 create 는 한 쿼리로 되는데,
update는 불가능하다.
2번에 나눠야 한다.
A 업데이트 치는것, A-B, B 업서트 하는것
초반 코드는 이거다
// Update banner fields using Updates
if err := r.DB().Session(&gorm.Session{FullSaveAssociations: false}).Updates(banner).Error; err != nil {
logger.Error(gormhelpers.ErrUpdateRecord, err)
return gormhelpers.ErrUpdateRecord
}
if banner.Image != nil {
// Update associated images using Association
if err := r.DB().Model(banner).Association("Image").Replace(banner.Image); err != nil {
logger.Error(gormhelpers.ErrUpdateRecord, err)
return gormhelpers.ErrUpdateRecord
}
}
FullSaveAssociations 이건 동작하지도 않는다.
문서의 설명이 너무 빈약해서 추측하자면...
디폴트는 false 이고, 원할때, true로 바꾸는것 같다.
그치만... true, false 상관없이 전체 업데이트가 된다.
즉 A, AB, B 업데이트가 전체적으로 된다. 다만 AB의 기존 거를 삭제하지 않는다.
AB를 삭제하지 않아서 생기는 문제 떄문에
두번쨰 쿼리를 실행해야한다.
두번째를 실행하면 B insert, AB 최신화를 한다.
이렇게 되면 AB, B 를 두번 입력하게 되서 문제가 생긴다.
간략하게 추상화하면
[첫번째 쿼리]
A update (정상)
AB insert
B insert
[두번쨰 쿼리]
B insert
AB upsert ( B의 id 값 제외하고 삭제 )
이 결과값은
A는 쿼리를 중복으로 날리지만, 1번입력되서 넘어간다 치는데,
AB는 insert 두번 insert가 되고 같은 key 값으로 들어가서 문제생긴다.
해결은 ...
omit 으로 해결했다.
해보지못한 해결책으론 ..
B insert 시 ON DUPLICATE KEY UPDATE 이걸로 하는데, 값만 중복되게 셋팅하면 잘 유지되면 괜찮을거같기도하고 ....
근데 다시 생각해보면 안될것 같기도함.
뭐 참... 거시기함..
어째뜬 omit으로 해결
'Web > GoLang' 카테고리의 다른 글
[golang] stringer 열거형이나 const 일때 자동으로 tostring 할수 있는 제터레이터 auto-generate Stringer tool of Golang (0) | 2023.08.22 |
---|---|
[golang] time 타입 parsing 오류 (parsing time "~~~" as "~~~": cannot parse "~~~" as "~~~") (0) | 2023.08.22 |
[golang] errors.Is 재정의시 사용법 (0) | 2023.07.26 |
[golang] makefile , gomodule 에 대한 윈도우 사용 후기와 makefile 설정 리뷰 (0) | 2023.05.05 |
[Grpc ] grpc k8s kubernetes 관련 내용 (0) | 2023.01.30 |
댓글