Определите триггер в сиквелизе - NodeJS - PullRequest
0 голосов
/ 28 сентября 2019

В настоящее время я работаю с 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?

...