# #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);