前言
Sequelize 是 Node.js 环境下的 ORM 框架。它提供了对关系型数据库的访问,使得开发者可以使用 JavaScript 的语法来操作数据库,而不需要手动编写 SQL 语句。本文将介绍如何在 Sequelize 中定义模型。
模型结构
在 Sequelize 中,模型是指一个数据库表的抽象。它包含了表的结构、约束和关系。定义一个模型时,需要指定它对应的数据库表名、各个字段的名称和类型、以及与其他模型之间的关系。
下面是一个例子,定义了一个名为 User
的模型:
-- -------------------- ---- ------- ----- - ---------- ----- - - --------------------- ----- ---- ------- ----- -- ----------- --- - ----- ------------------ ----------- ----- -------------- ----- -- ----- ----------------- ---- ------------------ -- - ---------- ---------- ------ ---展开代码
这个模型对应的是一个名为 user
的数据库表,包含三个字段:id
、name
和 age
。其中 id
是主键,自增类型为整数,name
和 age
的类型分别为字符串和整数。可以看出,模型定义的关键在于调用 init
方法,并传入模型的结构。在上面的例子中,我们还指定了模型的名称为 User
。
字段类型
在模型定义中,需要为每个字段指定它的类型。Sequelize 支持的字段类型如下:
Sequelize.STRING
: 字符串类型,可传入一个length
参数,指定字符串的长度。Sequelize.UUID
: UUID 类型,用于表示一个全局唯一的标识符。生成 UUID 的方式是使用 RFC4122 标准定义的算法,它可以产生 128 位的二进制数,转换成十六进制字符串后的长度为 32。Sequelize.INTEGER
: 整数类型,支持传入一个length
参数,指定整数的长度。Sequelize.FLOAT
: 浮点数类型,支持传入一个precision
和一个scale
参数,分别表示精度和小数位数。Sequelize.BOOLEAN
: 布尔类型。Sequelize.TIME
: 时间类型,保存时分秒信息,精确到秒。Sequelize.DATE
: 日期类型,保存年月日信息。Sequelize.DATEONLY
: 日期类型,只保存年月日信息。Sequelize.ENUM
: 枚举类型,支持传入一个可枚举的值列表。例如:Sequelize.ENUM('foo', 'bar', 'baz')
。Sequelize.JSON
: JSON 类型,可以存储任意 JSON 序列化后的数据。Sequelize.JSONB
: JSONB 类型,和 JSON 类型类似,但是它会在存储数据时对其进行二进制编码,对于包含大量重复数据或长度超过 2kB 的 JSON 数据,使用 JSONB 类型可以提高存储和查询的效率。Sequelize.ARRAY
: 数组类型,支持传入一个基础类型的参数,例如Sequelize.ARRAY(Sequelize.INTEGER)
表示整数数组。Sequelize.TEXT
: 文本类型,可以存储任意长度的文本字符串。Sequelize.BLOB
: 二进制类型,可以存储任意长度的二进制数据。
字段选项
除了类型外,每个字段还可以定义多个选项,用于指定字段的属性和约束条件。
primaryKey
: 是否为主键,类型为布尔值,默认为false
。autoIncrement
: 是否为自增类型,类型为布尔值,默认为false
。allowNull
: 是否允许为空值,类型为布尔值,默认为true
。unique
: 是否唯一,类型为布尔值或一个字符串,默认为false
。如果设置为字符串,则表示唯一性索引的名称。例如:unique: 'foo'
表示创建一个名为foo
的唯一性索引。comment
: 字段的注释,类型为字符串,默认为null
。defaultValue
: 默认值,可以是一个固定值或一个函数,类型可以根据上面介绍的字段类型进行自行推导。field
: 字段的名称,如果不指定,则默认为模型属性的名称。validate
: 字段值的验证规则,可以是一个数组或一个对象。数组中的每个元素都是一个验证器函数,对象的每个属性都是一个验证器函数。每个验证器函数都有两个参数:第一个参数为需要验证的属性值,第二个参数为当前验证器所在的上下文对象,通过上下文对象可以访问整个模型的所有属性,可以实现多个属性之间的联合验证。例如:
-- -------------------- ---- ------- ----- - ---------- ----- - - --------------------- ----- ------- ------- ----- -- -------------- ------ - ----- ----------------- ---------- ------ -- ----- --------------- ------- ----------------------- ------------- -- - ---------- ---------- ---------- --------- - ---------------------------- - -- ----------- -- --------- -- ------------------ - ----------------- - ----- - ----- --- ------------ --- ---- ------ ------ --- ------ -------- - -- -- ---展开代码
上面的例子中,我们定义了一个 Article
模型,它拥有 title
、body
和 status
三个字段。而在 validate
选项中,我们定义了一个名为 validateTitleAndBodyLength
的验证器函数,用于验证 title
和 body
的长度之和是否超过了 1000,如果超过则抛出一个错误。
关联关系
在 Sequelize 中,模型之间可以有多种关联关系,包括一对一、一对多、多对多等。下面我们举例说明如何定义这些关联关系。
一对一
假设我们有一个 User
模型和一个 Profile
模型,一个用户只能有一个个人资料,一个个人资料也只能对应一个用户。这时我们就可以使用一对一的关联关系。
-- -------------------- ---- ------- ----- - ---------- ----- - - --------------------- ----- ---- ------- ----- -- ----------- ----- ----------------- -- - ---------- ---------- ------ --- ----- ------- ------- ----- -- -------------- ------ ----------------- -- - ---------- ---------- --------- --- --------------------- ------------------------展开代码
在上面的代码中,我们调用了 hasOne
和 belongsTo
两个方法分别为 User
和 Profile
定义了关联关系。hasOne
表示一对一中的“拥有方”,也就是 User
模型,而 belongsTo
表示一对一中的“被拥有方”,也就是 Profile
模型。这段代码的作用是让 User
模型拥有一个名为 Profile
的属性,并将其与 Profile
模型进行关联,而在 Profile
模型中,也会增加一个名为 User
的属性,并将其与 User
模型进行关联。
一对多
假设我们有一个 Article
模型和一个 Comment
模型,一篇文章可以有多个评论,而一个评论只能属于一篇文章。这时我们就可以使用一对多的关联关系。
-- -------------------- ---- ------- ----- - ---------- ----- - - --------------------- ----- ------- ------- ----- -- -------------- ------ ----------------- ----- --------------- -- - ---------- ---------- --------- --- ----- ------- ------- ----- -- -------------- ----- --------------- -- - ---------- ---------- --------- --- ------------------------- ---------------------------展开代码
在上面的代码中,我们同样使用了 hasMany
和 belongsTo
两个方法分别为 Article
和 Comment
定义了关联关系。这段代码的作用是让 Article
模型拥有一个名为 Comments
的数组属性,并将其与 Comment
模型进行关联,而在 Comment
模型中,也会增加一个名为 Article
的属性,并将其与 Article
模型进行关联。
多对多
假设我们有一个 User
模型和一个 Group
模型,一个用户可以属于多个组,一个组也可以有多个用户。这时我们就可以使用多对多的关联关系。
-- -------------------- ---- ------- ----- - ---------- ----- - - --------------------- ----- ---- ------- ----- -- ----------- ----- ----------------- -- - ---------- ---------- ------ --- ----- ----- ------- ----- -- ------------ ----- ----------------- -- - ---------- ---------- ------- --- ------------------------- - -------- ------------ --- ------------------------- - -------- ------------ ---展开代码
在上面的代码中,我们调用了 belongsToMany
方法分别为 User
和 Group
定义了关联关系。这段代码的作用是让 User
模型和 Group
模型之间相互关联,并创建一个名为 UserGroups
的关联表,该表将两个模型的 ID 存储在其中,以建立两个模型之间的多对多关系。
结语
在本文中,我们详细介绍了在 Sequelize 中如何定义模型,并演示了如何使用各种字段类型、字段选项和关联关系。当使用 Sequelize 进行数据库编程时,模型是一个非常重要的概念,良好的模型设计可以大大简化数据库访问和维护工作。希望本文能够帮助读者更好地理解 Sequelize 的模型设计,从而提高对 Sequelize 的使用技巧和编程能力。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6784b3b29137010942eb865e