掘金日新计划&Sequelize知识合集四

128 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天

一、 约束和验证的区别

验证是在纯 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 NULL SQL 约束进行定义. 这样,尝试将值设置为 null 的直接 SQL 查询也将失败.

四、 验证器

使用模型验证器,可以为模型的每个属性指定 格式/内容/继承 验证. 验证会自动在 createupdate 和 save 时运行. 你还可以调用 validate() 来手动验证实例.

请注意,在需要将多个参数传递给内置验证函数的情况下,要传递的参数必须位于数组中. 但是,如果要传递单个数组参数,例如,isIn 可接受的字符串数组,则将其解释为多个字符串参数,而不是一个数组参数.

五、 allowNull 与其他验证器的交互

如果将模型的特定字段设置为不允许为 null(使用 allowNull: false),并且该值已设置为 null,则将跳过所有验证器,并抛出 ValidationError.

另一方面,如果将其设置为允许 null(使用 allowNull: true),并且该值已设置为 null,则仅会跳过内置验证器,而自定义验证器仍将运行.

举例来说,这意味着你可以拥有一个字符串字段,该字段用于验证其长度在5到10个字符之间,但也允许使用 null (因为当该值为 null 时,长度验证器将被自动跳过):

class User extends Model {}
User.init({
  username: {
    type: DataTypes.STRING,
    allowNull: true,
    validate: {
      len: [5, 10]
    }
  }
}, { sequelize });

烟火向星辰,所愿皆成真!