node--ORM(object relational mapping)数据库操作

今天简单来说一下node通过ORM框架操作数据库的问题。ORM框架可以让我们通过使用对象实例的方式对数据库数据进行操作(即:对象---数据库表---映射关系)。

本文基于windows系统,使用的数据库是mysql版本是mysql-5.7.30,提供一个下载地址,大家根据自己的情况去下载:https://downloads.mysql.com/archives/community/
Mac的看看这篇文章:https://blog.csdn.net/youzhouliu/article/details/80782892
对于windows而言配置有些麻烦给大家推荐一篇文章里面有配置的比较详细的步骤:https://www.cnblogs.com/520BigBear/p/12764499.html
用到的操作数据库的软件:Navicat Premium 12
直接导入sal语句可生成数据库表。

再说一下用到的依赖
sequelize:
github:https://github.com/demopark/sequelize-docs-Zh-CN
sequelize-auto:
github:https://github.com/sequelize/sequelize-auto
mysql2:
github:https://github.com/sidorares/node-mysql2/tree/master/documentation

Sequelize 是一个基于 promise 的 Node.js [ORM]它具有强大的事务支持, 关联关系, 预读和延迟加载,读取复制等功能。
我们需要创建工程化脚本,通过sequelize-auto自动生成数据模型对象,我们可以通过数据模型对象提供的方法去操作数据库,这样是为了让我们尽可能少的写sql语句去操作。
Sequelize 提供的大多数方法都是异步的,返回的是Promises类型,因此我们可以直接使用Promises的API。

我们基于之前那篇《node日志框架、环境变量和路由控制》来进行操作。首先我们准备一个shell脚本用来生成模型数据文件
安装一下依赖包

npm i sequelize sequelize-auto mysql2 -S 或
cpm i sequelize sequelize-auto mysql2 -S 或
yarn addi sequelize sequelize-auto mysql2  

sequelize-modal.sh脚本文件

#!/bin/bash
HOST="127.0.0.1"
DB="数据库名"
USER="root"
PASS="数据库密码"
PORT="3306"
DIR="./models" #生成的文件目录
#JSON_DEFINED="."
EXEC="sequelize-auto -o ${DIR} -d ${DB} -h ${HOST} -u ${USER} -p ${PORT} -x ${PASS} -e mysql"
#EXEC="sequelize-auto -o ${DIR} -d ${DB} -h ${HOST} -u ${USER} -p ${PORT} -x ${PASS} -e mysql -a ${JSON_DEFINED}"

#sequelize是node最受欢迎的orm库,普遍使用 Promise. 意味着所有异步调用可以使用 ES2017 async/await 语法.
#sequelize-auto是可以生成sequelize模型的一个工具
#npm install -g sequelize-auto mysql
#-h 数据库的IP地址 
#-d 数据库名 
#-u 用户名 
#-x 密码 
#-p 端口 
#-t 表名
#-e 数据库类型
#-a  json定义文件路径,可以追加一些自定义配置,如{"timestamps": false}
#sequelize-auto -o . -h localhost -d jindu_loan -u root -x root -p 3306
#run
$EXEC

执行shell脚本,注意windows不要使用自带的命令提示符工具,可以使用Git Bash Here或者Cmder,因为我有安装git我使用Git Bash Here执行命令:

sh sequelize-modal.sh

执行成功后会发现我们的目录会对出一个models文件


1.png

我们在shell脚本配置的是"./models",他会生成在根目录下面,我在根目录下面创建了一个api的文件夹,将models文件移入api文件下面。
我在api下面创建了一个dbcontros.js文件

import Sequelize from "sequelize";
import fs from "fs";
import path from "path"

const dbconfig = {
    database: "数据库名",
    username: "root",
    password: "数据库密码",
    host: "localhost",
    port: 3306,
    timezone: "+08:00", //时区
    dialect: "mysql",  //  one of 'mysql' | 'mariadb' | 'postgres' | 'mssql' 
    define: {
        timestamps: false
    }
}
let sqlize = new Sequelize(dbconfig);//创建一个Sequelize实例连接数据库
let db = {};
//读取models下面的数据模型文件存储到定义的db对象中
fs.readdirSync(path.join(__dirname,"/models")).forEach(file => {
    const model = require(path.join(__dirname, `/models/${file}`))(sqlize, Sequelize.DataTypes)
//sequelize.import(path.join(__dirname,`/models${file}`));(注意下载的sequelize版本6+不可使用import要用require)
    db[model.name] = model;
})
export default db;

然后再到api文件下面创建一个index.js文件用来简单实现一个查询数据库的小demo,引入刚上面导出的db对象

import dbdata from "./dbcontros"
const user = dbdata.jd_user;
function findUser(name, pwd){
   return user.findOne({//这个方法是数据模型提供的
       where :{
        account: name,   //左边的名字对应user模型名  右边是参数 
        password: pwd
       }
   })
}
export {findUser}

接着给之前router文件下面的constructor.js和index.js文件中添加一些代码
router/constructor.js:

 import {findUser} from "../api"//引入api/index.js中导出的方法
 const constructor = {
    login(req, res){
        if(req.body.uname && req.body.pwd){
            res.send({code: 200, msg: "login success"})
            return 
        }
        res.send({code: 400, msg: "login failed"})
    },
    list(req, res){
        let list = [
            {name: "a", age:10},
            {name: "b", age:11},
            {name: "c", age:12},
        ]
        res.status(200).json(list)
    },
    getUser(req, res){//新添加的方法
        findUser("test1", "123456").then(data => {
            res.status(200).json(data);
        })
    }
}
export default constructor

router/index.js:

import ctro from "./constructor"//引入控制器方法
export default (express, app) => {
    const router = express.Router();
    router.route("/login").post(ctro.login);
    router.route("/list").get(ctro.list);
    router.route("/getuser").get(ctro.getUser);//新添加的
    app.use("/api",router);
}

在终端执行命令

npm run start:dev

查看页面http://localhost:3001/api/getuser

2.png

再到Navicat Premium 12中查看jd_user的表
3.png

发现查找到了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341