这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战
验证 和 约束
验证和约束的区别
验证是在纯 JavaScript 中在 Sequelize 级别执行的检查. 如果提供自定义验证器功能,它们可能会非常复杂,也可能是 Sequelize 提供的内置验证器之一, 如果验证失败,则根本不会将 SQL 查询发送到数据库.
另一方面,约束是在 SQL 级别定义的规则. 约束的最基本示例是唯一约束. 如果约束检查失败,则数据库将引发错误,并且 Sequelize 会将错误转发给 JavaScript(在此示例中,抛出 SequelizeUniqueConstraintError), 在这种情况下,与验证不同,它执行了 SQL 查询
唯一约束
username 字段上定义了唯一约束:
/* ... */ {
username: {
type: DataTypes.TEXT,
allowNull: false,
unique: true
},
} /* ... */
同步此模型后(例如,通过调用sequelize.sync),在表中将 username 字段创建为 `username` TEXT UNIQUE,如果尝试插入已存在的用户名将抛出 SequelizeUniqueConstraintError
允许/禁止 null 值
默认情况下,null 是模型每一列的允许值. 可以通过为列设置 allowNull: false 参数来禁用它,就像在我们的代码示例的 username 字段中所做的一样:
/* ... */ {
username: {
type: DataTypes.TEXT,
allowNull: false,
unique: true
},
} /* ... */
如果没有 allowNull: false, 那么调用 User.create({}) 将会生效.
关于 allowNull 实现的说明
allowNull 检查是 Sequelize 中唯一由 验证 和 约束 混合而成的检查. 这是因为:
- 如果试图将
null设置到不允许为 null 的字段,则将抛出ValidationError,而且 不会执行任何 SQL 查询 - 另外,在
sequelize.sync之后,具有allowNull: false的列将使用NOT NULLSQL 约束进行定义. 这样,尝试将值设置为null的直接 SQL 查询也将失败.
验证器
使用模型验证器,可以为模型的每个属性指定 格式/内容/继承 验证. 验证会自动在 create, update 和 save 时运行. 你还可以调用 validate() 来手动验证实例.