Выполнение обновления таблицы с помощью ошибки конфликта Gorm — on

# #database #postgresql #go-gorm

Вопрос:

Я пытаюсь выполнить действие upsert на своем столе, и для этого я использую следующий метод горма.

 func (s *store) UpsertFeatureToModel(f2m *model.FeatureToModel) (*model.FeatureToModel, error) {
    result := s.db.Table(f2mTable).Clauses(clause.OnConflict{
        Columns:   []clause.Column{{Name: "feature_name"}, {Name: "feature_set_name"}, {Name: "training_job_id"}},
        UpdateAll: true,
    }).Create(f2m)
    if result.Error != nil {
        return nil, result.Error
    }
    return f2m, nil
}
 

Я вижу в своем регистраторе, что этот вызов метода превращается в следующий postgresql:

 INSERT INTO "feature_to_model" ("training_job_id","feature_name","feature_set_name","model_name","created_at") VALUES ('test_id_2','feature_2','set_1','test_package_test_variant2','2021-06-21 11:57:33.784') ON CONFLICT ("training_job_id") DO UPDATE SET "feature_name"="excluded"."feature_name","feature_set_name"="excluded"."feature_set_name","model_name"="excluded"."model_name"
 

«training_job_id», «feature_name» и «feature_set_name» уникальны в совокупности, но не по отдельности. Итак, я считаю, что мне нужно иметь это в моем sql ON CONFLICT (all three columns) . Хотя я указал все три столбца в предложении onConflict, они не отражаются на результирующем postgresql. Что я делаю не так в этом вызове метода Gorm.
Также вот мои спецификации таблицы: (если что-то покажется неправильным или ненужным, пожалуйста, дайте мне знать, потому что я не очень хорошо знаком с postgresql и базами данных)
Спасибо!

 SELECT 'up SQL query';
CREATE TABLE IF NOT EXISTS feature_to_model (
    training_job_id     varchar NOT NULL,
    feature_name        varchar NOT NULL,
    feature_set_name    varchar NOT NULL,
    model_name          varchar NOT NULL,
    created_at          timestamp with time zone DEFAULT now() NOT NULL,
    PRIMARY KEY (training_job_id, feature_name, feature_set_name),
    CONSTRAINT UC_feature_to_model UNIQUE (training_job_id, feature_name, feature_set_name)
);

CREATE INDEX IF NOT EXISTS feature_to_model_training_job_id_idx on feature_to_model (training_job_id);
CREATE INDEX IF NOT EXISTS feature_to_model_feature_set_name_idx on feature_to_model (feature_set_name);
CREATE INDEX IF NOT EXISTS feature_to_model_feature_name_idx on feature_to_model (feature_name);