У меня есть следующая структура, где LinguisticMetadata
является отношением:
metadataDB := &dbm.VideoMetadata{
ID: *imdbid,
ImdbID: *imdbid,
TmdbID: tmdbID,
IsSeries: input.Episode != nil,
ImdbRating: imdbRating,
Adult: extendedMetadata.Adult,
LinguisticMetadata: linguisticListDB, // LinguisticMetadata []*LinguisticMetadata `gorm:"not null"`
Subtitles: subtitlesDB, // Subtitles []*Subtitle
}
Я хочу создать новые метаданные или обновить существующие, если они уже существуют. Это не проблема и может быть легко достигнуто следующим образом:
newMetadata := dbm.VideoMetadata{}
db.Where(dbm.VideoMetadata{ID: *imdbid}).Assign(metadataDB).FirstOrCreate(&newMetadata)
Однако мне также нужно иметь такое же поведение для его отношений. Первичные ключи для LinguisticMetadata
- это префикс страны, например: "en", "fr", "it" ... Таким образом, весьма вероятно, что он уже существует для данных метаданных. Следовательно, если первичные ключи отношений уже существуют, модель должна быть обновлена (или заменена).
С кодом, показанным выше, я получаю следующую ошибку, если первичный ключ LinguisticMetadata уже существует:
pq: значение дублированного ключа нарушает уникальное ограничение "linguistic_metadata_pkey"
Это не имеет смысла для меня, потому что, как указано здесь :
GORM будет автоматически сохранять ассоциации и ссылки на них при создании / обновлении записи. если у ассоциации есть первичный ключ, GORM вызовет Update, чтобы сохранить его, в противном случае он будет создан.