奉上最新代码: 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项目
下一篇:未完待续!!!