sequelize + Nodejs + MySQL 的简单用法
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 initSequelize 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.7volumes:- db_data:/var/lib/mysqlrestart: alwaysenvironment:MYSQL_DATABASE: mySequelizeDBMYSQL_ROOT_PASSWORD: password111MYSQL_USER: aliceMYSQL_PASSWORD: password111ports:- "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 直接查看数据库。