koa搭建服务器(二)

在上一篇文章已经成功的运行了一个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中文网

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值