播种时运行 sequelize 模型钩子

Posted

技术标签:

【中文标题】播种时运行 sequelize 模型钩子【英文标题】:Run sequelize model hooks when seeding 【发布时间】:2017-06-06 01:10:36 【问题描述】:

我目前正在尝试使用 sequelize 为 postgresql 数据库播种,我在我的模型上声明了钩子,在创建单独的记录(例如测试)时工作得很好

我的种子文件中的数据是否需要在最终表格中显示,或者我可以在创建时调用挂钩吗?

这是我的文件:

/*users-seed.js*/
'use strict'

module.exports = 
  up: function (queryInterface, Sequelize) 
    return queryInterface.bulkInsert('Users', [/*users-data*/])
  ,
  down: function (queryInterface, Sequelize) 
    return queryInterface.bulkDelete('Users', null, )
  

/*user.js*/
module.exports = function (sequelize, DataTypes) 
  let User = sequelize.define('User', 
    /* user attributes */
  , 
      instanceMethods: 
        hashPassword: function (password) 
          return bcrypt.hash(password, 15)
        ,
        hashEmail: function (email) 
          return crypto.createHash('sha256').update(email).digest('hex')
        
      ,
      hooks: 
        beforeCreate: function (user) 
          return user.hashPassword(user.password_digest).then(function (hashedPassword) 
            user.email = user.hashEmail(user.email)
            user.password_digest = hashedPassword
          ).catch(e =>  console.log('e', e); throw new Error(e) )
        ,
        beforeBulkCreate: function (users) 
          return users.forEach(function (user) 
           return user.hashPassword(user.password_digest).then(function (hashedPassword) 
              user.email = user.hashEmail(user.email)
              user.password_digest = hashedPassword
            ).catch(e =>  console.log('e', e); throw new Error(e) )
         )
        
      
    )
  return User

【问题讨论】:

【参考方案1】:

好吧,这是我的错误,我误解了queryInterface.bulkInsert() 的工作原理,我认为它在“插入”之前调用了模型钩子(是的,这是我误解的)它们在数据库中,它插入原始数据你输入了字符串,我认为这就是为什么在文档中使用 bulkCreate、bulkUpdate 等的模型实例显示挂钩的原因

【讨论】:

以上是关于播种时运行 sequelize 模型钩子的主要内容,如果未能解决你的问题,请参考以下文章

跨 Sequelize 关联播种数据

更改数据库模型 - Sequelize

使用 Sequelize.js 进入包含模型

使用 Typescript 在 Sequelize 模型中创建实例方法

如何在使用 Sequelize 更改列或添加新列时更新迁移文件

了解 Sequelize 中的关联