Web/GoLang

[gorm] many2many Association 관계

벨포트조던 2023. 8. 16.
반응형

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으로 해결 

 

 

 

 

 

반응형

댓글