sequelize.js - 使用 sequelize 插入时如何填充数据库默认值?

标签 sequelize.js

在我的架构上,我有这个......

const userSchema = db.define('USER',
  {
    id: { type: Sequelize.UUIDV4, allowNull: false, primaryKey: true},
   ...
   }

在我的 MSSQL 数据库上,我有这个:
id uniqueidentifier  NOT NULL DEFAULT NEWID(),

因此, NEWID() 将使用新的 UUIDV4 数据填充 id。
但是,当我执行 User.create(...) 时,这会给我一个 ValidationError [SequelizeValidationError]: notNull Violation: USER.id cannot be null

然后我决定尝试一下:
 hooks : {
        beforeCreate(user, options) {
             user.id = generateNewUUID()
        }
     }

但它也不起作用,因为钩子(Hook)只是在模式验证后执行。

是否有一些解决方法不涉及将 id 作为 User.create 的参数?这是我想避免的事情。

最佳答案

其他评论者观察到 OP 可能一直在使用主键,该主键在验证方面具有特殊行为。但标题一般询问“值(value)观”。关于这个问题的常见建议是:

  • 删除模型定义上的allowNull要求,或
  • 使用 Hook 手动插入默认值。

  • 这些都不是很好的答案。选项 1 有效地永久扭曲了您的模型(和验证)。选项 2 更接近正确,但仍然烦人且不直观:如果我必须构建逻辑来应用它,那么设置默认值有什么意义?
    作为记录:如果您确实想使用选项 2,beforeCreate 将无济于事(正如您所注意到的),因为该 Hook 在验证后被调用。您必须使用 beforeValidate Hook - 然后专门添加逻辑以确保仅在创建记录时触发 Hook 。像这样:
    hooks: {
        beforeValidate: async (user) => {
            if (user.isNewRecord) await applyDefaults(user);
        },
    }
    
    这^有效。但这是 真正的 解决方案:
    不要写任何钩子(Hook)。在模型上定义您的默认值,如下所示:
    const userSchema = db.define('USER', {
        id: {
            type: Sequelize.UUIDV4,
            allowNull: false,
            primaryKey: true,
            defaultValue: generateNewUUID()
    }})
    
    然后,在创建实例时, 使用 Model.build() 而不是 Model.create() 。前者在验证之前正确应用默认值。例如:
    var user = User.build({
        email: "myemail@example.com"
    })
    user = await user.save()
    console.log(user.id) // <--- Now works as expected
    
    警告:在撰写本文时,Sequelize 仍然是 doesn't seem to support promises for default values 。如果您需要将已解决的 promise 应用为 defaultValue,那么您会遇到选项 1 或 2。

    关于sequelize.js - 使用 sequelize 插入时如何填充数据库默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57754149/

    相关文章:

    postgresql - Sequelize设置时区查询

    model - 使用 OR 条件设置 Sequelize.js 关联

    node.js - 无论有没有缓存,sequelize 都很慢

    mysql - 序列化的 SQL

    mysql - 使用 Sequelize 和 MySQL 方言生成模型

    mysql - 如何在Sequelize中设置查询超时?

    node.js - 引用 Typescript .d.ts 文件中定义的其他库类型/接口(interface)

    mysql - 如何在 MySql 中使用 sequelize 运行多个原始查询?

    mysql - Sequelize 模型中两列之间的乘法

    mysql - 事务提交后验证错误