node从入门到放弃系列之(12)丝滑的操作数据库及表模型

奉上最新代码: node服务demo代码=》koa2-server项目代码;vue前端demo代码=》 vue-client项目代码
如果git登不上可以换gitee=》koa2-server项目代码;vue前端demo代码=》 vue-client项目代码

sequelize

Sequelize 是一个基于 promise 的 Node.js ORM, 目前支持 Postgres, MySQL, MariaDB, SQLite 以及 Microsoft SQL Server. 它具有强大的事务支持, 关联关系, 预读和延迟加载,读取复制等功能。

mysql2的缺点

原生的mysql是没有对象关系映射ORM的,也就是说你curd的过程中都是操作数据库的原始字段。默认数据库的规范中字段定义是用下划线连接的,而前后端交互中字段的规范一般是驼峰连接。
这样就出现了一个问题:两者的规范不同,必须做后端做处理,如果每次操作数据库都处理下下的话对交互性能的影响是巨大的。
要解决这个矛盾,就需要用到 Node.js ORM,Sequelize 模块闪亮登场!!

sequelize使用

在 Node.js 社区中,sequelize 是一个广泛使用的 ORM 框架,它支持 MySQL、PostgreSQL、SQLite 和 MSSQL 等多个数据源。

实例及模型文件参考

连接到数据库

要连接到数据库,必须创建一个 Sequelize 实例. 这可以通过将连接参数分别传递到 Sequelize 构造函数或通过传递一个连接 URI 来完成。
以我的项目为例是通过将连接参数分别传递到 Sequelize 构造函数实现连接的:

// db.js
// 由于同步数据库时需要用到,所以不可使用别名
const Sequelize = require('sequelize');
const config = require('../config/config.js');
const proSql = require('../sql.json');

// 数据库信息,自己对应更换
const db = config.NODE_ENV === 'devshielopment' ? config.dev : proSql;
// 如有报错使用下面这个
// const db = config.NODE_ENV === 'development' ? config.dev : config.pro;

// 连接数据库
const sequelize = new Sequelize(db.database, db.user, db.password, {
  host: db.host, // 数据库地址
  port: db.port, // 数据库端口
  dialect: 'mysql', // 指定连接的数据库类型
  timezone: '+08:00', // 时区,如果没有设置,会导致数据库中的时间字段与中国时区时间相差8小时
  pool: {
    max: 5, // 连接池中最大连接数量
    min: 0, // 连接池中最小连接数量
    idle: 30000 // 如果一个线程 30 秒钟内没有被使用过的话,那么就释放线程
  },
  logging: false, // 关闭sql语句打印
  // 解决中文输入问题
  define: {
    timestamps: true, // 是否自动创建时间字段, 默认会自动创建createdAt、updatedAt
    paranoid: true, // 是否自动创建deletedAt字段
    createdAt: 'createTime', // 重命名字段
    updatedAt: 'updateTime',
    deletedAt: 'deleteTime',
    underscored: true, // 开启下划线命名方式,默认是驼峰命名
    freezeTableName: true, // 禁止修改表名
    charset: 'utf8mb4',
    dialectOptions: {
      collate: 'utf8mb4_0900_ai_ci'
    }
  }
});

// 测试连接是否成功
sequelize
  .authenticate()
  .then(() => {
    console.log('Connection has been established successfully.');
  })
  .catch(err => {
    console.log('Unable to connect to the database', err);
  });

module.exports = sequelize;

测试下连接
在这里插入图片描述

sequelize模型

模型是sequelize的本质,sequelize通过一个个的模型与数据库的表建立起映射关系,每一个模型对应数据库的一个表。

user表模型

const Sequelize = require('sequelize');
const seq = require('../db');

// users
const user = seq.define(
  'user',
  {
    id: {
      type: Sequelize.STRING(64),
      primaryKey: true,
      allowNull: false, // 是否允许为空
      unique: true, // 是否是唯一索引
      comment: '主键'
    },
    userName: {
      type: Sequelize.STRING,
      allowNull: false, // 是否允许为空
      unique: true, // 是否是唯一索引
      comment: '用户名,唯一'
    },
    password: {
      type: Sequelize.STRING,
      allowNull: false,
      comment: '密码'
    },
    isCancel: {
      type: Sequelize.BOOLEAN,
      allowNull: false,
      defaultValue: 0,
      comment: '状态 0:有效,1:失效'
    }
  },
  {
    // 写表注释
    comment: '用户信息表'
  }
);

module.exports = user;

如果模型多了,且关系复杂了怎么办呢?我的办法是新建一个index.js来处理所有的模型文件

// index.js
const user = require('./model/user'); // 用户表
const route = require('./model/route'); // 路由表
const onlineToken = require('./model/onlineToken'); // token表
const dictionary = require('./model/dictionary'); // 字典表
const scenicSpot = require('./model/scenicSpot'); // 景区表
const captcha = require('./model/captcha'); // 景区表

// 可以在此文件中建立外键关联关系
onlineToken.belongsTo(user, {
  foreignKey: 'userId',
  targetKey: 'id'
});
captcha.belongsTo(user, {
  foreignKey: 'userId',
  targetKey: 'id'
});

// User->Blog
// User.hasMany(Blog)

module.exports = {
  user,
  route,
  onlineToken,
  dictionary,
  scenicSpot,
  captcha
};

同步所有模型

同步模型的目的是将所有创建好的表模型同步到数据库上,然后对数据库进行curd操作

在根目录下新建同步文件dbSync.js

// dbSync.js

const sequelize = require('./db/db.js'); // sequelize实例
require('./db/index'); // 表模型
sequelize
  .sync({
    force: true // 如果表已经存在,则删除表后再创建
  })
  .then(result => {
    console.log('所有模型均已成功同步');
    process.exit();
  })
  .catch(err => {
    console.log('所有模型均已成功失败');
    console.log(err);
  });

通过nod命令运行

node ./dbSync.js

控制台提示同步结果
在这里插入图片描述

CURD测试

const { User } = require('@db/index');
// 查询所有用户
const users = await User.findAll();
console.log(users.every(user => user instanceof User)); // true
console.log("All users:", JSON.stringify(users, null, 2));

详细介绍直接上sequelize官网,就不当搬运工了

到这,简单的单表查询啥的都能搞定了,高级的笔者还没用到,发动你们聪明得小脑瓜自学了

sequelize-auto

接触那么几天sequelize后你会发现越用越顺手,但是还是存在问题

sequelize的不足

按照上面得教程,我们要在模型中添加新字段时,有两个办法:

  • 修改模型文件,然后同步模型。如果表已经存在得话强制同步,表中数据会全部丢失;不强制的话无法同步表模型。
  • 直接navicat操作数据库,然后同步手动修改表模型。这样做费时费力,有时候字段类型设置错误会埋雷

那么有没有办法自动获取数据库表模型,然后更新本地模型文件呢?

sequelize-auto介绍

sequelize-auto是一个帮助我们快速生成表结构的工具,能对照数据库自动生成相应的models。

自动生产表模型命令

sequelize-auto -h "数据库地址" -d "数据库名" -u "用户名" -x "密码" -p "端口号"  -o "导出模型存放位置" -e "数据库" -a "特殊配置" --caseProp c --caseModel c

所有配置查看npm上得介绍

对于这个命令,我们可以写到package.json中,需要导出时,使用npm run models就能使用

"scripts": {
    "models": "sequelize-auto -h "数据库地址" -d "数据库名" -u "用户名" -x "密码" -p "端口号"  -o "导出模型存放位置" -e "数据库" -a "特殊配置" --caseProp c --caseModel c"
},

导出模型的使用

在这里插入图片描述

导出的模型关系都在init-models.js文件中,柯是之前我们都是放在index.js中,那么就需要修改下index,js文件内容及使用

// index.js
const sequelize = require('./db');

const initModels = require('./models/init-models');
const models = initModels(sequelize);

module.exports = models;

// 使用
const models = require('@db/index');
...
const res = await models.模型文件.create(data);
// 或者
models.模型文件.create(data).then(res => {...}).chtch(err => {})

现在我们使用起sequelize就比较方便了。
直接操作navicat操作数据库,然后npm run models导出最新模型覆盖旧的,其他都没变化,是不是效率立马提高了不少。

看完如果还有啥不懂得,或者对我这个方法有意见得欢迎评论区留言。
觉得写的不错的可以动动小手一键三连下。

上一篇:node从入门到放弃系列之(11)用优雅的代码武装我们的koa2项目
下一篇:未完待续!!!

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值