本文介绍model的options选项
model的一个例子
1 | class Foo extends Model {} |
时间戳(timestamps)
默认情况下自动创建createdAt
和updatedAt
详见下面的配置。
Getter & Setter
可以有两种方法定义getter
&setter
:
- 属性的定义中
- model的options中
如果两个地方都定义了,则属性中的优先
属性定义:
1 | class Employee extends Model {} |
model的options中定义:
下面是在model的options中定义getter
&setter
的例子
fullName
getter是一个你如何定义数据库中并不存在的列的虚假属性(pseudo properties)的例子。事实上,虚假属性可以在两个地方定义:model getters和virtual datatype。virtual datatype可以有验证,而虚拟属性不行。注意在fullName
的getter方法中引用的this.firstname
和 this.lastname
将会触发各自的getter方法。如果你不想触发,可以使用getDataValue()
方法来获取原始值:
1 | class Foo extends Model { |
验证(validation)
Model validations允许为每一个attribute指定格式/内容/继承验证。
Validations会在 create
, update
和 save
时自动触发,也可以在一个实例里手动调用validate()
触发
属性验证器
可以自定义验证器或者使用validator.js内建的一些验证器
1 | class ValidateMe extends Model {} |
注意:验证函数有些地方需要传入多个参数,传入的参数必须是数组。但是如果要传入一个数组参数
,例如 isIn
, 将会被解释成多个字符串参数而不是一个数组参数。解决方法是传入一个单一长度的数组,就像上面例子中的 [['one', 'two']]
。
用自定义错误信息代替 validator.js中提供的默认信息,需要使用一个对象而不是纯值或参数数组。例如不需要参数的验证器可以设置如下自定义信息:
1 | isInt: { |
或者如果需要参数,可以加上 args
属性:
1 | isIn: { |
当使用自定义验证器函数时,错误消息将是抛出的 Error
对象所持有的任何消息。
有关内置验证方法的更多详细信息,请参阅 validator.js project .
*提示: *你还可以为日志记录部分定义自定义函数. 只是传递一个方法. 第一个参数将是记录的字符串.
属性验证器 与 allowNull
如果模型的特定字段设置为不允许为空(使用allowNull:false
)并且该值已经被设置为 null
,则所有的验证器都将跳过并抛出 ValidationError
异常。
另一方面,如果设置为允许为空(使用 allowNull:true
)并且该值已经被设置为 null
,则只会跳过内置验证器,而自定义验证器仍将执行。
这意味着可以使用一个字符串字段来验证其长度在5到10个字符之间,但也允许为 null
(因为当值为 null
时,将自动跳过长度验证器):
1 | class User extends Model {} |
你也能利用自定义验证器有条件的允许 null
值,因为它不会被跳过:
1 | class User extends Model {} |
通过设置 notNull
验证器,你能自定义 allowNull
的错误信息:
1 | class User extends Model {} |
模型范围验证
验证器也可以在特定字段验证器之后用来定义检查模型。例如,你可以确保纬度
和经度
都不设置,或者两者都设置。如果设置了一个而另一个未设置则验证失败。
模型验证器方法与模型对象的上下文一起调用,如果它们抛出错误,则认为失败,否则认为通过。这与自定义字段特定的验证器是一样的。
所收集的任何错误消息都将与验证结果对象一起放在字段验证错误中。这个错误使用在validate
参数对象中以失败的验证方法的键来命名。即便在任何一个时刻,每个模型验证方法只能有一个错误消息,它会在数组中显示为单个字符串错误。以最大化与字段错误的一致性。
1 | class Pub extends Model {} |
在这种简单情况下,如果给定纬度或经度,而不是同时包含两者,则验证失败。 如果我们尝试构建一个超范围的纬度和经度,那么raging_bullock_arms.validate()
可能会返回
1 | { |
这样的验证也可以通过在单个属性上定义的自定义验证器(例如latitude
属性,通过检查(value === null) !== (this.longitude === null)
)来完成,但模型范围的验证方法更清晰.
配置(configuration)
你可以通过Sequelize handles影响列名:
1 | class Bar extends Model {} |
当你想使用timestamps,但是只想使用一部分,或者使用另外的名字时:
1 | class Foo extends Model {} |
你也能更改数据库engine,比如MyISAM。默认值是InnoDB
1 | class Person extends Model {} |
最后,你可以在MySQL和PG中给表增加注释
1 | class Person extends Model {} |
乐观锁(Optimistic Locking)
Sequelize通过version原生支持乐观锁。默认是不启用的,可以通过设置version启用
乐观锁允许并发修改操作并且防止overwriting data冲突。当检测到冲突时,会抛出OptimisticLockError错误
数据库同步
当开始一个新的项目时,你还不会有一个数据库结构,并且使用Sequelize你也不需要它。只需指定你的模型结构,并让库完成其余操作。目前支持的是创建和删除表:
1 | // Create the tables: |
因为同步和删除所有的表可能要写很多行,你也可以让Sequelize来为做这些:
1 | // Sync all models that aren't already in the database |
因为.sync({ force: true })
是具有破坏性的操作,可以使用match
参数作为附加的安全检查。
match
参数可以通知Sequelize,以便在同步之前匹配正则表达式与数据库名称 - 在测试中使用force:true
但不使用实时代码的情况下的安全检查。
1 | // This will run .sync() only if database name ends with '_test' |
扩展model
Sequelize 模型是ES6类。你可以轻松添加自定义实例或类级别的方法
1 | class User extends Model { |
当然,你还可以访问实例的数据并生成虚拟的getter:
1 | class User extends Model { |
索引
在Model.sync()
或者sequelize.sync
同步时,可以增加索引到模型定义中
1 | class User extends Model {} |