在上一篇文章已经成功的运行了一个http服务器,接下来就是使用Sequelize ORM(官方文档:Sequelize 简介 | Sequelize中文文档 | Sequelize中文网)来操作数据库。
1、安装依赖
首先也是需要安装相关的依赖
npm i sequelize
npm i mysql2
2、连接数据库
2.1 创建Sequelize实例&定义模型属性
由于在实际项目中连接一个数据库中的多个表,所以在这里我建了一个models文件夹,index.js用来遍历models文件夹下的js文件并依次创建实例
// index.js
const { Sequelize } = require('sequelize');
const fs = require('fs');
const path = require('path');
const config = require('../config');// 数据库配置的文件,单独整合出来
const basename = path.basename(__filename);
const models = {};
let sequelize;
const initModels = async () => {
if (!config.mysql.host || !config.mysql.port) {
return null;
}
// 创建实例
sequelize = new Sequelize({
dialect: 'mysql',
logging: config.isDev
? (msg) => {
logger.debug('msg---',msg);
}
: false,
timezone: '+08:00', // 修正时区
...config.mysql,
});
// 遍历models文件夹下的所有文件并返回后缀名为js的文件,modelFiles: [MultiAccount.js, Sort.js]
const modelFiles = fs.readdirSync(__dirname).filter((file) => {
return file.indexOf('.') !== 0 && file !== basename && file.slice(-3) === '.js';
});
// 如果modelFiles不存在或者modelFiles的长度为0,直接退出
if (!modelFiles || !(modelFiles.length)) {
return null;
}
// 遍历modelFiles中的每一项,并进行实例的创建
modelFiles.forEach((file) => {
const modelDefinition = require(path.join(__dirname, file));
// `sequelize.define` 会返回模型
const model = sequelize.define(
modelDefinition.modelName,
{
...modelDefinition.attributes,
},
modelDefinition.options,
);
// 把创建好的实例存到对象models中,键名为对应js文件中定义的modelName,键值为model实例
models[modelDefinition.modelName] = model;
});
try {
await sequelize.authenticate();
logger.info(`MYSQL连接成功 ${config.mysql.host}:${config.mysql.port}`);
} catch (error) {
logger.error(`MYSQL连接失败[${config.mysql.host}:${config.mysql.port}] :${error}`);
return null;
}
return sequelize;
};
module.exports = {
initModels,
models,
sequelize,
};
if (require.main === module) {
sequelize
.authenticate()
.then(() => {
console.log('Connection has been established successfully.');
})
.catch((error) => {
console.error('Unable to connect to the database:', error);
});
}
定义属性则跟上文一样,在对应的js文件中,例如:
// MultiAccount.js
const { DataTypes } = require('sequelize');
module.exports = {
modelName: 'MultiAccount',
attributes: {
fb_time: {
type: DataTypes.CHAR,
defaultValue: '',
},
fb_id: {
type: DataTypes.INTEGER,
defaultValue: '',
},
fb_userid: {
type: DataTypes.INTEGER,
defaultValue: '',
},
target_userid: {
type: DataTypes.INTEGER,
defaultValue: '',
},
target_login_time: {
type: DataTypes.CHAR,
defaultValue: '',
},
rela_users: {
type: DataTypes.CHAR,
defaultValue: '',
},
target_type: {
type: DataTypes.INTEGER,
defaultValue: '',
},
qa_content: {
type: DataTypes.CHAR,
defaultValue: '',
},
qa_pics: {
type: DataTypes.CHAR,
defaultValue: '',
},
status: {
type: DataTypes.INTEGER,
defaultValue: '0',
},
sorts: {
type: DataTypes.CHAR,
defaultValue: '',
},
create_time: {
type: DataTypes.CHAR,
defaultValue: '',
},
},
options: {
tableName: 'multi_account',
createdAt: false,// 不自动增加createdAt数据创建时间字段,默认为true
updatedAt: false,// 不自动增加updatedAt数据更新时间字段,默认为true
},
};
2.2操作数据库
操作数据库就可以使用Sequelize内置的方法了,这里用我的查询接口为例,接口可以支持日期、状态、分类、分页查询,所以需要动态给where添加相应的条件
let where ={}// 查询条件
static async getFbList(ctx) {
const { start_time, end_time, status = '-1', sort = '-1', page, pageSize } = ctx.request.body
//日期查询(默认当天数据,前端传过来)
if (start_time && end_time) {
where = {
...where,
fb_time: {
[Op.between]: [start_time, end_time]
}
}
}
//状态查询(默认为-1全部数据)
if (status !== '-1') {
where = {
...where,
status: {
[Op.eq]: [status]
}
}
}
//分类查询
if (sort !== '-1') {
where = {
...where,
sorts: {
[Op.eq]: [sort]
}
}
}
//当前查询条件下的数据总数
const total = await models.MultiAccount.count({where: where})
//当前查询条件下的数据列表,offset为去掉前多少个数据,limit为每页数据的数量,order是根据fb_time这个字段来排序
const fb_list = await models.MultiAccount.findAll({where: where, limit: Number(pageSize), offset: Number((page - 1)*pageSize), order:[['fb_time']] });
//查询成功后重置查询条件
where = {}
ctx.body = {
list: fb_list,
total,
};
}
框架其他的一些方法可以看下以下文章,
1、使用Sequelize - 廖雪峰的官方网站 (liaoxuefeng.com)
2、使用Sequelize模块操作数据库之增删改查_sequelize修改语句-CSDN博客
3、模型查询(基础) | Sequelize中文文档 | Sequelize中文网