前言
在现代 Web 开发中,关系型数据库是不可缺少的一部分。Node.js 提供了许多模块来处理数据库操作,而其中比较流行的是 Sequelize,它是一个基于 Promise 的 ORM 框架。在本文中,我们将会介绍如何使用 Sequelize 进行关系型数据库的 CRUD(增删改查)操作,并且结合 Express.js 实现一个完整的示例。
什么是 Sequelize
Sequelize 是一个基于 Promise 的 Node.js ORM(对象关系映射)框架,它支持普通的 SQL 语句和事务,同时也支持 PostgreSQL、MySQL、MariaDB、SQLite 和 MSSQL 等关系型数据库。Sequelize 可以将数据库表和 Sequelize 模型进行映射,从而实现方便的数据管理和查询操作。
前置要求
在开始学习 Sequelize 和 Express.js,您需要事先具备以下知识:
- Node.js 基础开发知识
- JavaScript ES6 语法
- MySQL 数据库基础知识
- Express.js 基础开发知识
安装和配置
在本文中,我们将使用以下依赖库:
- Node.js v12 或以上版本
- NPM v6 或以上版本
- Express.js v4
- Sequelize v6
首先,我们需要创建一个新的 Node.js 项目并初始化它:
mkdir sequelize-express-demo cd sequelize-express-demo npm init -y
然后,我们需要安装以下依赖库:
npm install express sequelize mysql2 --save
其中,mysql2
是 MySQL 数据库驱动程序,您可以使用其他的数据库驱动程序,比如 pg
或者 sqlite3
等,具体可以参考 Sequelize 的文档。
下一步,我们需要在项目的根目录下创建一个 .env
文件,用来保存数据库连接信息,内容如下:
DB_HOST=localhost DB_PORT=3306 DB_USERNAME=root DB_PASSWORD= DB_DATABASE=test
其中,DB_HOST
、DB_PORT
、DB_USERNAME
、DB_PASSWORD
和 DB_DATABASE
分别是数据库的主机名、端口号、用户名、密码和数据库名,您需要根据自己的实际情况进行修改。
最后,在项目根目录下创建一个 app.js
文件,并编写以下代码:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- ---------- - ----------------------- ----- --------- - --------------------- --------------------------- ----- --- - ---------- ----- ---- - ---------------- -- ----- --------------------------- ------------------------------- --------- ---- ---- ----- --------- - --- ---------- ------------------------ ------------------------ ------------------------ - ----- -------------------- ----- -------------------- -------- -------- - -- --------- --------------- -------- -- - ----------------------- --- ---- ----------- ---------------- -- ------------ -- - --------------------- -- ------- -- --- ----------- ----- --- ---------------- -- -- - -------------------- --- --------- -- --------------------------- ---展开代码
其中,我们使用 dotenv
模块读取 .env
文件中的环境变量,然后创建了一个 Sequelize 实例并进行了数据库连接测试。
到现在为止,我们已经完成了 Sequelize 和 Express.js 的安装和配置,开始了解如何使用 Sequelize 进行 CRUD 操作。
Sequelize 的模型定义
在 Sequelize 中,模型是将数据库表映射为 JavaScript 对象的一种方式。每个模型都代表了一个数据库表,模型中的属性对应了数据库表中的列,模型实例对应了数据库表中的一行数据。
我们可以通过 sequelize.define()
方法定义一个新的模型,它接受三个参数:模型名称、属性对象和一些其他的选项。例如,我们可以定义一个 Todo 模型来表示一个待办项:
-- -------------------- ---- ------- ----- ---- - ------------------------ - --- - ----- --------------------------- -------------- ----- ----------- ----- -- ------ - ----- ---------------------- ---------- ------ -- ---------- - ----- ------------------ ---------- ------ ------------- ------ -- -- - ----------- ----- ------------ ----- ---------- -------- ---展开代码
其中,我们定义了三个属性:
id
:表示待办项的唯一标识符,它是一个自增的无符号整数。title
:表示待办项的标题,它是一个长度为 100 的字符串,不能为空。completed
:表示待办项的完成状态,它是一个布尔值,默认值为 false。
除了属性以外,我们还可以指定一些其他选项:
timestamps
:指定是否自动生成 createdAt 和 updatedAt 两个字段,表示每个记录的创建时间和更新时间。该选项默认值为 true。underscored
:指定是否使用下划线作为模型和列名之间的分隔符。该选项默认值为 false。tableName
:指定模型对应的数据库表名。如果不指定,则默认使用模型名称的复数形式。
Sequelize 的 CRUD 操作
在了解了模型定义之后,我们可以开始进行 Sequelize 的 CRUD 操作了。Sequelize 提供了多种方法来进行数据的增删改查操作,下面分别介绍。
增加操作
我们可以使用模型的 create()
方法向数据库中插入一条记录,例如:
Todo.create({ title: 'Buy milk', completed: false, }).then((todo) => { console.log(todo.toJSON()); });
其中,create()
方法的参数是一个对象,它的属性名称对应了模型的属性名称。在插入成功后,then()
方法的参数就是插入的记录实例,我们可以使用 toJSON()
方法将它转换为 JSON 格式的数据。
删除操作
我们可以使用模型的 destroy()
方法从数据库中删除一条记录。例如,我们可以删除完成状态的待办项:
Todo.destroy({ where: { completed: true, }, }).then((count) => { console.log(`Deleted ${count} todos.`); });
其中,destroy()
方法的参数是一个对象,它的 where
属性表示删除的条件。在删除成功后,then()
方法的参数就是被删除的记录数量。
修改操作
我们可以使用模型的 update()
方法从数据库中更新一条记录。例如,我们可以将待办项的完成状态改为已完成:
-- -------------------- ---- ------- ------------- ---------- ----- -- - ------ - --- -- -- --------------- -- - -------------------- -------- --------- ---展开代码
其中,update()
方法的第一个参数是一个对象,它表示要更新的属性名称和属性值。第二个参数是一个对象,它的 where
属性表示更新的条件。在更新成功后,then()
方法的参数就是被更新的记录数量。
查询操作
我们可以使用模型的 findAll()
方法来查询一条或多条记录。例如,我们可以查询所有未完成的待办项:
Todo.findAll({ where: { completed: false, }, }).then((todos) => { console.log(todos.map((todo) => todo.toJSON())); });
其中,findAll()
方法的参数是一个对象,它的 where
属性表示查询的条件。在查询成功后,then()
方法的参数是一个包含所有查询结果的数组。
如果我们只需要查询一条记录,可以使用模型的 findOne()
方法来查询,例如:
Todo.findOne({ where: { completed: false, }, }).then((todo) => { console.log(todo.toJSON()); });
类似地,findOne()
方法的参数是一个对象,它的 where
属性表示查询的条件。在查询成功后,then()
方法的参数就是一个记录实例。
在 Express.js 中使用 Sequelize
在了解了 Sequelize 的模型定义和 CRUD 操作之后,我们可以将它与 Express.js 集成,实现一个完整的示例。
首先,我们在 app.js
文件中添加以下代码:
const todoRouter = require('./routes/todo'); app.use('/todos', todoRouter);
其中,我们引入了一个名为 todoRouter
的路由器,并将它绑定到 /todos
路径下。在下一步中,我们将在 routes/todo.js
文件中定义路由器。
在 routes/todo.js
文件中,我们需要引入模型定义和 Express.js:
const express = require('express'); const { Todo } = require('../models'); const router = express.Router();
然后,我们定义以下路由:
-- -------------------- ---- ------- -- ------- --------------- ----- ---- ----- -- - -------------- ------------- -- - ---------------- -- ------------ -- - ---------- --- --- -- ------- ------------------ ----- ---- ----- -- - -------------- ------ - --- -------------- -- -- ------------ -- - -- ------- - ---------------------- -------- ----- --- ------- --- - ---- - --------------- - -- ------------ -- - ---------- --- --- -- ----- ---------------- ----- ---- ----- -- - --------------------- ------------ -- - --------------------------- -- ------------ -- - ---------- --- --- -- ----- ------------------ ----- ---- ----- -- - --------------------- - ------ - --- -------------- -- -- --------------- -- - -- ------ --- -- - ---------------------- -------- ----- --- ------- --- - ---- - ---------- -------- ----- --------- --- - -- ------------ -- - ---------- --- --- -- ----- --------------------- ----- ---- ----- -- - -------------- ------ - --- -------------- -- -- ------------- -- - -- ------ --- -- - ---------------------- -------- ----- --- ------- --- - ---- - ---------- -------- ----- --------- --- - -- ------------ -- - ---------- --- ---展开代码
其中,/
路径对应查询所有待办项,/:id
路径对应查询单个待办项,POST /
路径对应创建待办项,PUT /:id
路径对应更新待办项,DELETE /:id
路径对应删除待办项。
在定义完路由器之后,我们需要在 app.js
文件中引入路由器:
const todoRouter = require('./routes/todo'); app.use('/todos', todoRouter);
最后,我们运行以下命令启动应用程序并测试它:
npm start
打开浏览器并访问 http://localhost:3000/todos
,应该可以看到所有的待办项。您也可以使用 curl
命令或者其他的 HTTP 客户端进行查询、创建、更新和删除操作。例如,运行以下命令创建一个新的待办项:
curl -i -H "Content-Type: application/json" -X POST -d '{"title":"Study Node.js","completed":false}' http://localhost:3000/todos
如果一切正常,您应该可以看到类似以下的响应:
HTTP/1.1 201 Created Content-Type: application/json; charset=utf-8 Location: /todos/1 Content-Length: 65 ETag: W/"41-UO7/Xy5YS5igfGe/pa/Jyc9X4m4" {"id":1,"title":"Study Node.js","completed":false,"createdAt":"..."}
结论
在本文中,我们介绍了如何使用 Express.js 和 Sequelize 进行关系型数据库的 CRUD 操作,包括模型定义、创建、查询、更新和删除操作,并提供了一个完整的示例。希望这篇文章可以对您有所帮助,谢谢阅读!
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/676fef98e9a7045d0d785777