node.js - 在 sequelize 中定义触发器 - NodeJS
问题描述
我目前正在后端项目上使用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 声明触发器是否有不同或正确的方法?
解决方案
通过处理历史来处理数据库更改的正确方法是使用序列迁移。
这需要安装 sequelize-cli 并在 src / migrations 目录中(可选)。请参阅文档。
https://sequelize.org/master/manual/migrations.html
例子:
在 src/migration/create_table_person.js 中创建迁移文件
module.exports = {
up: función (queryInterface, DataTypes) {
return queryInterface.createTable ('par_ec', {
id_par_ec: {
tipo: DataTypes.INTEGER,
primaryKey: verdadero,
allowNull: falso,
autoIncrement: verdadero
},
nombre: {
tipo: DataTypes.TEXT,
allowNull: falso
}
});
}
};
到 src/config/data_base.json 数据库的连接设置
{
"username": "postgres",
"contraseña": "admin",
"base de datos": "ppte",
"host": "localhost",
"dialecto": "postgres",
"zona horaria": "América / La_Paz",
"MigrationStorage": "secuelizar",
"MigrationStorageTableName": "sequelize_migration",
"registro": falso,
"grupo": {
"max": 15,
"min": 0,
"inactivo": 10000,
"adquirir": 10000,
"desalojar": 10000,
"handleDisconnects": verdadero,
"autoreconnect": verdadero
}
}
执行所有挂起的迁移
sequelize db: migrate --migrations-path src / migrations --config src / config / data_base.json
推荐阅读
- spring - 导入org.springframework 无法解决
- r-markdown - 抑制 RMarkdown 中的消息 - 不起作用
- c# - 在多个项目中共享 wwwroot
- android - Crashlytics 不会使用 apk-splits 上传映射文件
- sql - 提取超过一个月没有数据输入的工作区
- c++ - c++ 11 typeid of string and sizeof nullptr
- kubernetes - Hazelcast 无法在 Kubernetes 中启动
- c# - 我们可以使用 Web API 发送内存流对象吗?
- c++ - 我对 substr 函数有问题(C++)
- python - TypeError: unhashable type: 'list' using add edge from networkx