How to Use Sequelize ORM in NodeJS - Tutorial
1 Sequlize 简介
Sequelize 是最流行的可以与 Nodejs 一起使用的一种关系数据库 ORM (Object-relational mapping 对象关系映射),Mongoose 是 MongoDB 的 ORM.
Sequelize 的作用,简单地说,就是避免在代码里写原生 SQL 语句,而是将这种语句改成 JavaScript:
不必再写类似下面这样含有 SELECT
或者 DELETE
等语句的代码:
app.get("/employees", (req, res) => {
db.query("SELECT * from employees", (err, result) => {
if (err) {
console.log(err);
} else {
res.send(result);
}
});
});
2. 使用 Nodejs,Sequlize,和 MySql
2.1. 新建 node 工程
运行以下命令初始化工程,并安装 express
, sequelize
:
npm init --y
npm install express sequelize
2.2 安装 MySQL 驱动
与各种数据库相对应的驱动安装命令如下:
$ npm install --save pg pg-hstore # Postgres
$ npm install --save mysql2
$ npm install --save mariadb
$ npm install --save sqlite3
$ npm install --save tedious # Microsoft SQL Server
$ npm install --save oracledb # Oracle Database
运行 npm i mysql2
.
这里安装的是 mysql2
而不是 mysql
,如果直接使用 SQL 语句与 MySQ L交互,安装 mysql
,使用 sequelize 则安装 mysql2
。mysql
和 mysql2
之间的区别基本在于Promise,即使用 mysql2
包可以写异步 JS 代码。
2.3 安装 Sequelize CLI 工具
npm i -g sequelize-cli
,这里必须加-g
选项, 否则终端不会识别 sequlize
.
使用 sequelize-cli
能自动生成一些配置文件,从而节省时间。
终端运行命令 sequelize init
:
PS D:\yt\node-mysql-sequelize> sequelize init
Sequelize CLI [Node: 16.14.0, CLI: 6.6.0, ORM: 6.31.0]
Created "config\config.json"
Successfully created models folder at "D:\yt\node-mysql-sequelize\models".
Successfully created migrations folder at "D:\yt\node-mysql-sequelize\migrations".
Successfully created seeders folder at "D:\yt\node-mysql-sequelize\seeders".
工程文件夹下自动生成一些文件夹,删除此项目不会用到的seeders
, migrations
,保留 config
和 models
。
2.4 修改config/config.json
"development"
部分代码修改如下
"development": {
"username": "root",
"password": "password111",
"database": "mySequelizeDB",
"host": "localhost",
"dialect": "mysql"
},
这里的 mysql
可以改成任何其他使用的数据库,例如如果使用 Postgres 就改成 postgres
.
2.5 增加文件 models/User.js
Sequlize 基于model 在数据库种创建表,User.js
将映射到一个 User
表。
要创建多少个表,就写多少个model,这个User
表只定义了两列,firstName
和 age
,
User.js
:
module.exports = (sequelize, DataTypes) => {
const User = sequelize.define("User", {
firstName: {
type: DataTypes.STRING,
allowNull: false,
validate: {
notEmpty: true,
},
},
age: {
type: DataTypes.INTEGER,
allowNull: false,
validate: {
notEmpty: true,
},
},
});
return User;
};
2.6 server.js
代码
定义了一些 route,以实现用户的读取、创建和删除,因为只用浏览器简单测试,所以创建删除用户也是用的 get
:
const express = require("express");
const app = express();
const db = require("./models");
const { User } = require("./models");
// 查看全部用户
app.get("/select", (req, res) => {
User.findAll()
.then((users) => {
res.send(users);
})
.catch((err) => {
console.log(err);
});
});
// 查看名字为 "Elisa" 的用户,
app.get("/select-name", (req, res) => {
User.findAll({ where: { firstName: "Elisa" } })
.then((users) => {
res.send(users);
})
.catch((err) => {
console.log(err);
});
});
// 创建用户
app.get("/insert", (req, res) => {
User.create({
firstName: "Elisa",
age: 22,
}).catch((err) => {
res.status(401).json({ message: "Inserted failed." });
});
res.json({ message: "Inserted success." });
});
// 删除第一个用户
app.get("/delete", (req, res) => {
User.destroy({ where: { id: 1 } });
res.json({ message: "deleted" });
});
db.sequelize.sync().then((req) => {
app.listen(3001, () => {
console.log("Server running at port 3001................");
});
});
2.7 启动 MySQL
工程根目录下创建 docker-compose.yaml
:
version: "3.9"
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_DATABASE: mySequelizeDB
MYSQL_ROOT_PASSWORD: password111
MYSQL_USER: alice
MYSQL_PASSWORD: password111
ports:
- "3306:3306"
volumes:
db_data:
运行 docker compose up -d
启动 MySQL 容器 (运行 docker compose down -v
删除容器及命名卷。)
这里的用户名及密码等必须与 2.4 中的一致。
2.8 运行 Node app
运行 node server.js
, 可以使用浏览器测试各种 route,结果也可以通过 MySQL Workbench 直接查看数据库。