В настоящее время я работаю с sequelize v5 в бэкэнд-проекте, мы используем postgresql в качестве базы данных.
Я знаю, что sequelize может определять хуки как средство для реализации триггеровОднако мне требуется реализация (или определение) триггеров базы данных непосредственно в базе данных.
Я определил хуки, как это было подробно описано в документации , но заметил, что не удалось формально определитьтриггер в базе данных.
hooks: {
beforeUpdate: (instance, options) => {
sequelize.models.themodelIwantToUse.create({
actionType: 'UPDATE',
key: instance.dataValues.key,
newValue: instance.dataValues.value,
oldValue: instance._previousDataValues.value,
createdAt: instance.dataValues.createdAt,
createdBy: instance.dataValues.createdBy
})
}
}
Менеджер проекта настаивает на объявлении триггеров, поэтому я сделал следующее:
sequelize.query("" +
"CREATE OR REPLACE FUNCTION the_model_i_want_to_use_log_func() " +
" RETURNS TRIGGER " +
"AS $$ " +
"BEGIN " +
" IF TG_OP = 'UPDATE' OR TG_OP = 'DELETE' THEN " +
" INSERT INTO a_schema.the_model_i_want_to_use(key, action_type, old_value, new_value, created_at, created_by) VALUES (NEW.key, TG_OP, OLD.value, NEW.value, NEW.created_at, NEW.created_by); " +
" RETURN NEW; " +
" END IF; " +
"" +
" RETURN NEW; " +
"END; " +
"$$ " +
" LANGUAGE plpgsql; " +
"DROP TRIGGER IF EXISTS general_config_log ON a_schema.the_model_i_want_to_use; " +
"CREATE TRIGGER general_config_log " +
"AFTER INSERT OR UPDATE OR DELETE ON a_schema.the_model_i_want_to_use" +
"FOR EACH ROW EXECUTE PROCEDURE the_model_i_want_to_use_log_func(); "
);
проблема (как вы можете сказать) с приведенным выше фрагментом кода заключается в том, что он будет перезаписыватьтриггеры и функции каждый раз, когда создается экземпляр squelize.
Я знаю, что это сломается, если мы изменим базу данных (на MySql, например), но это не проблема, с которой я сейчас беспокоюсь.
Есть ли другой или правильный подход к объявлению триггеров с помощью sequelize?