Обновить модель и ее отношения с уже существующими первичными ключами - PullRequest
1 голос
/ 20 октября 2019

У меня есть следующая структура, где 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, чтобы сохранить его, в противном случае он будет создан.

...