[gorm] many2many Association 관계
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
Associations
Auto Create/UpdateGORM will auto-save associations and its reference using Upsert when creating/updating a record. user := User{ Name: "jinzhu", BillingAddress:
gorm.io
공식문서보고 해결이 잘 안된다 욕나온다.. ㅅㅂ
우선 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으로 해결