我正在尝试使用sequelize创建触发器。主要思想是在创建USER
之后创建CONFIG
的示例。
// USER MODEL
module.exports = function(sequelize, DataTypes) {
var User = sequelize.define('User', {
name : DataTypes.STRING(255),
email : DataTypes.STRING(255),
username : DataTypes.STRING(45),
password : DataTypes.STRING(100),
}, {
classMethods : {
associate : function(models) {
User.hasOne(models.Config)
}
}
});
return User;
};
// CONFIG MODEL
module.exports = function(sequelize, DataTypes) {
var Config = sequelize.define('Config', {
notifications : DataTypes.INTEGER
}, {
classMethods : {
associate : function(models) {
Config.belongsTo(models.User)
}
}
});
return Config;
};
正如您所看到的,一个“user”有一个“config”,而一个“config”属于一个“user”,所以在创建一个用户之后,我想自动创建他的配置行。
目标是:
DELIMITER //
CREATE TRIGGER create_config AFTER INSERT ON user
FOR EACH ROW
BEGIN
insert into config (user_id) values(new.user_id);
END; //
DELIMITER ;
现在,我要做的模拟是:
.then(function(user){
return dao.Config.create(req.body, user, t);
})
一旦创建了一个用户,我就像这样创建他的配置...它工作,但不是我正在寻找的。
我该怎么做?
3条答案
按热度按时间avwztpqn1#
您可以通过以下两种方式之一来完成此操作。正如您所指出的,您可以在数据库本身中创建触发器。您可以运行原始序列化查询来完成此操作:
或者,您可以在用户模型上创建一个hook,它对
afterCreate
事件执行操作:vjhs03f72#
SQL TRIGGER helper同时支持PostgreSQL和SQLite
用法:将此放在
.sync
之后:触发器每次都被重新定义,因此即使它们之前已经定义,也可以工作,即不需要
sync({ force
:How does sequelize.sync() work, specifically the force option?助手:
我认为每个DBMS不可能避免大的
if
,因为:下面是一个带有Assert的最小可运行示例。在本例中,我们使用一个触发器来保持每个用户的
User.postCount
值在用户创建或删除某些帖子时保持最新。main.js
pacakge.json
生成的触发器定义查询示例:
SQLite:
PostgreSQL:
总有一天我会把这个合并回来的。总有一天。
在Ubuntu 22.10,PostgreSQL 13.6上测试。
vom3gejh3#
您可以像这样在Sequelize中添加触发器。[正如@Evan Siroky提到的,我只是添加了几个步骤以获得更多细节]