Sequelize 是 Node.js 中一款流行的 ORM 框架,它可以将 JavaScript 对象映射到关系型数据库中的表。为了实现这种映射关系,Sequelize 中有一个核心概念:Model,它是表和数据的实体。
本文将详细介绍 Sequelize 中 Model 的概念、使用方法和常见操作,并通过示例代码来阐明它们的使用。
Model 的概念
在 Sequelize 中,Model 是数据表的映射。它是一种特殊类型的类,用于定义关系型数据库表。每个 Model 都会映射到一个表,Model 的实例表示表中的一行数据。
在 Sequelize 中,Model 是使用类来定义的,这些类继承自 Sequelize.Model 类。在一个 Model 中,可以定义以下内容:
- 表名
- 字段
- 关联关系
- 查询范围(Scope)
- 钩子函数(Hook)
- 校验规则(Validator)
Model 的定义定义了数据表的详细信息,包括表名、字段、关联关系等。在使用 Sequelize 进行操作时,首先需要定义一个 Model,才能通过 Model 对数据库进行增删改查等操作。
下面我们来看看如何在 Sequelize 中定义 Model。
定义 Model
定义一个 Model 都需要三个参数:Model 名称、表结构、和可选的选项。在表结构中,我们需要定义表中的字段名、类型、长度、设置、默认值等等。在选项中,我们可以设置表名称、联合主键、时间戳、字符集等等。
首先,我们需要在项目中引入 Sequelize:
const Sequelize = require('sequelize');
接着,我们可以创建一个 Sequelize 实例来连接数据库:
const sequelize = new Sequelize('database', 'username', 'password', { host: 'localhost', dialect: 'mysql' });
这里我们以 MySQL 数据库为例,如果是其它数据库,需要改变对应的 dialect。
接下来,我们可以定义 Model 了。比如我们要定义一个名为 User 的 Model,表示用户,它的表结构如下:
字段名称 | 类型 | 说明 |
---|---|---|
id | Integer | 主键 |
name | String | 用户名 |
age | Integer | 年龄 |
gender | String | 性别 |
created_at | Date | 创建时间 |
updated_at | Date | 修改时间 |
那么我们可以这样定义 User 的 Model:
-- -------------------- ---- ------- ----- ---- - ------------------------ - --- - ----- --------------------------- ---------- ------ -------------- ----- ----------- ---- -- ----- - ----- --------------------- ---------- ----- -- ---- - ----- --------------------------- ---------- ------ ------------- - -- ------- - ----- ----------------------- ----------- ---------- ------ ------------- ------ -- ----------- --------------- ----------- -------------- ---
这里我们使用了定义 Model 的 sequelize.define 方法。第一个参数是 Model 的名称,第二个参数是表结构定义,我们定义了表结构的每一个字段的类型,长度等等信息。
常见操作
在定义好了 Model,我们就可以进行常见的增删改查等操作了。下面我们通过示例代码来介绍常见的操作。
查询数据
在 Sequelize 中,常用的查询操作包括 findAll、findOne 和 findByPk 等。我们以 findAll 查询为例:
const users = await User.findAll({ where: { name: 'Tom' } }); console.log(users);
这里我们使用了 findAll 方法,可以传递查询条件,在这里我们通过 where 属性指定查询条件。这里我们查询用户名为 Tom 的用户,结果会是一个包含 Tom 用户信息的数组。
插入数据
插入数据可以使用 create 方法:
const newUser = await User.create({ name: 'Jerry', age: 18, gender: 'male' }); console.log(newUser);
这里的 create 方法会返回创建出的 User 对象,如果需要保存到数据库中,需要手动调用一个实例的 save 方法。
更新数据
更新数据可以使用 update 方法:
const updateCount = await User.update({ age: 20 }, { where: { name: 'Jerry' } }); console.log(updateCount);
这里的 update 方法会返回受影响的行数。
删除数据
删除数据可以使用 destroy 方法:
const deleteCount = await User.destroy({ where: { name: 'Jerry' } }); console.log(deleteCount);
这里的 destroy 方法会返回删除的行数。
Model 的高级用法
在使用 Sequelize 的 Model 进行开发时,还有一些高级用法,可以帮助我们更好的利用 Model。
关联查询
在 Sequelize 中,可以通过关联关系进行多表查询。比如我们要定义一个名为 Comment 的 Model,表示评论,我们可以这样定义:
-- -------------------- ---- ------- ----- ------- - --------------------------- - --- - ----- --------------------------- ---------- ------ -------------- ----- ----------- ---- -- -------- - ----- ----------------------- ---------- ----- -- ----------- --------------- ----------- -------------- --- ------------------------ ----------------------
第一句定义了 Comment 的 Model,第二句使用了 belongsTo 定义了 Comment 和 User 的关联关系,表示 Comment 属于 User;第三句则使用 hasMany 定义了 User 和 Comment 的关联关系,表示 User 拥有多条 Comment。
然后我们可以进行一些关联查询,比如这样查询一个用户同时包含用户信息和评论信息:
-- -------------------- ---- ------- ----- ---- - ----- -------------- -------- - - ------ -------- ----------- ----------- --- ------ - --- - - --- ------------------
这里我们使用了 include 属性来定义多表查询,跟关系型数据库中的 JOIN 语句类似。
钩子函数
Sequelize 支持在 Model 中定义钩子函数,在执行不同步骤的时候执行一些代码,比如在插入数据前执行一些操作等等。
比如我们要在插入新数据之前将数据进行加密处理,我们可以定义如下的钩子函数:
User.beforeCreate(async user => { user.password = await bcrypt.hash(user.password, 10); });
这里我们定义了一个 beforeCreate 方法,并在其中使用 bcrypt 中的 hash 函数将密码加密处理。
校验规则
在使用 Sequelize 进行开发时,我们可以定义一些校验规则,确保传递到数据库中的数据符合我们的要求。比如我们定义一个 Model,确保用户名唯一:
-- -------------------- ---- ------- ----- ---- - ------------------------ - ----- - ----- ----------------- ---------- ------ ------- ----- --------- - --- ------------------------------------ --------- ---- - - ---
这里我们使用了 unique 属性确保用户名唯一,又使用了 validate 属性定义校验规则。
总结
Sequelize 是 Node.js 中流行的 ORM 框架,它可以将 JavaScript 对象映射到关系型数据库中的表。在 Sequelize 中,Model 是最核心的概念,它是数据表和数据实体的映射。本文详细介绍了 Sequelize 中 Model 的概念、定义方法以及常见操作,同时也介绍了 Model 的高级用法,包括关联查询、钩子函数和校验规则等。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64543240968c7c53b0836648