当前位置: 首页 > article >正文

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 则安装 mysql2mysqlmysql2之间的区别基本在于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".

工程文件夹下自动生成一些文件夹,删除此项目不会用到的seedersmigrations,保留 configmodels

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表只定义了两列,firstNameage
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 直接查看数据库。


http://www.kler.cn/a/14457.html

相关文章:

  • 2023网络搭建项目改革
  • 八、vue_options之computed、watch属性选项
  • 输电线路在线监拍设备的国网协议对接方案
  • 【pan-sharpening 攻击:目标检测】
  • Node.js -- 使用Express写接口
  • Dockerfile镜像LNMP的实战
  • CTA进网测试《5G消息 终端测试方法》标准依据:YDT 3958-2021
  • 【华为OD机试真题】硬件产品销售方案(javapythonC++)100%通过率 超详细代码注释
  • 银行数字化转型导师坚鹏:银行数字化创新应用与案例分析
  • 【数据结构第四章】- 串的模式匹配算法(BF 算法和 KMP 算法/用 C 语言实现)
  • Nginx +Tomcat 负载均衡,动静分离集群
  • navicat 远程连接oracle数据库ORA-12170及ORA-28547问题
  • Speech and Language Processing-之文本规范化
  • 工贸企业重大事故隐患判定标准,自2023年5月15日起施行
  • 后端开发常犯的问题(Java版)
  • Python VS C(上篇)
  • IPTV系统架构的分析与研究
  • 部署 Exsi 7.0.3
  • PointPillars点云编码器代码运行过程中的问题及解决
  • 如何借助分布式存储 JuiceFS 加速 AI 模型训练