如何在 SEQUELIZE (nodeJS) 中创建触发器?

Posted

技术标签:

【中文标题】如何在 SEQUELIZE (nodeJS) 中创建触发器?【英文标题】:How to create a TRIGGER in SEQUELIZE (nodeJS)? 【发布时间】:2015-06-25 07:36:12 【问题描述】:

我正在尝试使用 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;
;

如你所见,一个“用户”有一个“配置”,一个“配置”属于一个“用户”,所以在创建用户后我想自动创建他的配置行。

目标是做:

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

创建用户后,我会像这样创建他的配置...它可以工作,但不是我要搜索的内容。

我该怎么做?

【问题讨论】:

【参考方案1】:

您可以像这样在 Sequelize 中添加触发器。 [正如@Evan Siroky 提到的,我只是添加了更多步骤以获取更多详细信息]

import  Sequelize  from "sequelize";

const sequelize = new Sequelize(  host: "localhost",
                                   port: 3306,
                                   dialect: "mysql",
                                   username: "your user name",
                                   password: "your password",
                                   database: "dbname",
                                   logging: false,);

sequelize.query('CREATE TRIGGER create_config AFTER INSERT ON users' +
  ' FOR EACH ROW' +
  ' BEGIN' +
  ' insert into configs (UserId) values(new.id);' +
  'END;')

【讨论】:

【参考方案2】:

您可以通过以下两种方式之一来执行此操作。正如您所指出的,您可以在数据库本身中创建一个触发器。您可以运行原始的 sequelize 查询来完成此操作:

sequelize.query('CREATE TRIGGER create_config AFTER INSERT ON users' +
  ' FOR EACH ROW' +
  ' BEGIN' +
  ' insert into configs (UserId) values(new.id);' +
  'END;')

或者,您可以在用户模型上创建一个hook,以对afterCreate 事件执行操作:

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)
      
    ,
    hooks: 
      afterCreate: function(user, options) 
        models.Config.create(
          UserId: user.id
        )
      
    
  );
  return User;
;

【讨论】:

非常好,也适用于 mysqljs。您可以直接执行CREATE TRIGGER ...,而无需尝试更改示例中最常见的分隔符。

以上是关于如何在 SEQUELIZE (nodeJS) 中创建触发器?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Sequelize 中创建关联

使用 sequelize 创建具有关联层次结构的对象

如何在 NodeJS Sequelize 中按查询计算组

如何使用nodejs sequelize执行此SQL查询?

Nodejs / PostgreSQL sequelize - 如何更新/更改数据库中的模型?

如何在Nodejs中使用Sequelize在没有公共列的两个表上进行INNER JOIN?