在我的架构上,我有这个......
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
要求,或这些都不是很好的答案。选项 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/