有一个sequelize函数,它允许用一个数字来增加一个值,这个数字可以是负数也可以是负数,我想确保这个列总是正数或0,所以我在我的模型中添加了一个验证器:
module.exports = function (sequelize, DataTypes) {
var ProductVariant = sequelize.define('ProductVariant', {
id: {
type: DataTypes.INTEGER(11),
allowNull: false,
primaryKey: true,
autoIncrement: true
},
ProductId: {
type: DataTypes.STRING(45),
field: 'product_id',
allowNull: false,
primaryKey: true,
references: {
model: 'product',
key: 'id'
}
},
image: {
type: DataTypes.INTEGER(11),
allowNull: true
},
price: {
type: DataTypes.DECIMAL(6, 2),
allowNull: false
},
qty_stock: {
type: DataTypes.INTEGER(11),
allowNull: false,
defaultValue: 0
},
createdAt: {
type: 'TIMESTAMP',
allowNull: true,
field: 'creation_date'
},
updatedAt: {
type: 'TIMESTAMP',
field: 'last_updated',
allowNull: true
},
},
{
tableName: 'variants',
hooks: {
beforeValidate: function(variant, options) {
if (variant.qty_assigned < 0) {
throw new Error('Not valid');
}
}
}
});
ProductVariant.associate = function (models) {
ProductVariant.belongsTo(models.Product)
},
{
indexes:
[{
unique: true,
fields: ['product_id']
}]
}
return ProductVariant;
};
但当我这样做时:
await ProductVariant.increment({ qty_assigned: -100 }, {
where: { id: { [Op.eq]: variantId } },
transaction: t
});
我在不检查验证的情况下工作并更新值。我也尝试过:
qty_stock: {
type: DataTypes.INTEGER(11),
allowNull: false,
defaultValue: 0,
validate: {
min: 0
}
}
这可能和数据库中的增量有关吗?我能做些什么来添加验证吗?
验证是针对实例(在应用程序中(而不是针对DB进行的。
增量API是特殊的,因为它直接在数据库中更新值,而不是在实例上
发件人https://sequelize.org/master/class/lib/model.js~Model.html#静态方法增量(强调矿(
增加一列或多列的值。这是在数据库中完成的,这意味着它不使用当前存储在实例上的值增量是使用SET column=column+X WHERE foo='bar'查询完成的。要在实例中进行增量后获得正确的值,应重新加载。
如果你想增加并完成验证,你可以:
- 使用事务(或乐观锁定(并手动更新实例的值(使用sequelize验证(
- 在数据库中添加一个检查(mysql8+:https://dev.mysql.com/doc/refman/8.0/en/create-table-check-constraints.html)