koa搭建服务器(二)

在上一篇文章已经成功的运行了一个http服务器,接下来就是使用Sequelize ORM(官方文档:Sequelize 简介 | Sequelize中文文档 | Sequelize中文网)来操作数据库。

1、安装依赖

首先也是需要安装相关的依赖

npm i sequelize
npm i mysql2

2、连接数据库

2.1 创建Sequelize实例&定义模型属性

由于在实际项目中连接一个数据库中的多个表,所以在这里我建了一个models文件夹,index.js用来遍历models文件夹下的js文件并依次创建实例

// index.jsconst { 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.jsconst { 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数据创建时间字段,默认为trueupdatedAt: 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中文网

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/123135.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL面试题

面试题一 1、创建一个数据库 create database db_one; 2、 创建四张表 create table student( s_id int(10) not null comment 学号 primary key, s_name varchar(20) not null comment 姓名, s_birth year comment 生日, s_sex varchar(4) default "女" comment 性…

【PointNet—论文笔记分享】

第一个直接基于原始点云数据进行分割、分类的模型,之前都是基于多视图或者体素的方式。 论文: PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation代码: TensorFlow版 Pytorch版 基本模型架构: 分别对每个点进行特征提取…

微信小程序vue+uniapp旅游景点门票预订系统 名胜风景推荐系统

与此同时越来越多的旅游公司建立了自己的基于微信小程序的名胜风景推荐平台,管理员通过网站可以添加用户、景点分类、景点信息、在线预订、最新推荐,用户可以对景点信息进行在线预订,以及开展电子商务等。互联网的世界里蕴藏无限生机&#xf…

redis6.0源码分析:简单动态字符串sds

文章目录 sds简介与特性(面试)sds结构模型数据结构苛刻的数据优化数据结构优化uintX_t对齐填充 sds优势O(1)时间复杂度获取字符串长度二进制安全杜绝缓冲区溢出自动扩容机制——sdsMakeRoomFor方法 内存重分配次数优化 sds最长是多少部分API源码解读创建sds释放sds sds简介与特…

github中.gitignore不起作用啦

文章目录 前言两种方法解决清除本地缓存设置不需要 额外注意 前言 提示:人不是靠讲话来生活。每个人都应该靠行动。而行动,是需要时间来证明的。 --《自在独行》 两种方法解决 清除本地缓存 (.gitignore中已经表标明忽略的文件目录下的文件了&#xf…

Ubuntu 22.04自动登录进入桌面

1.编辑gdm3配置文件 sudo vim /etc/gdm3/custom.conf 2.修改内容为 AutomaticLoginEnableTrue AutomaticLoginusername 3.查看和重启服务 # 查看服务状态 systemctl --user status gnome-remote-desktop.service # 重启服务 systemctl --user restart gnome-remote-deskt…

如何从Android手机上轻松恢复误删除的短信 ?

当您使用 Android 手机时,您可能会误删除一些 Android 短信。如果这些消息对您很重要,您可能想要恢复它们。在这种情况下,您可以尝试使用U1tData安卓数据恢复(奇客软件) 来完成这项工作。这篇文章将向您展示更多信息。…

MinIO安装

Minio是一个开源的分布式对象存储服务器,它兼容Amazon S3服务接口。它可以用于构建私有云存储,为应用程序提供可扩展的对象存储功能。 安装 docker安装 docker run -d -p 9000:9000 -p 50000:50000 --name minio \ -e "MINIO_ROOT_USERadminpili…

Springmvc 讲解(1)

文章目录 前言一、SpringMvc1、简介2、核心组件和调用流程2.1 涉及组件的理解 3、小案例快速体验3.1场景需求3.1.1 导入依赖3.1.2 controller声明3.1.3 核心配置类3.1.4 环境搭建3.1.6 配置tomcat3.1.7 测试 二、SpringMvc 接收参数1.路径设置注解2、param接收参数四种类型2.1 …

AD教程(一)工程组成及创建

AD教程(一)工程组成及创建 工程组成 原理图库 绘制电阻模型、芯片模型、电容模型等,即将元件模型绘制出来。 原理图 将绘制的原件模型放置到原理图中,然后再添加连接的导线、网络标号。器件和器件之间的连接关系,在原…

单片机中的 _nop_() 延时以及其相关的基础扩展

使用 _nop_() 函数做延时遇到的一些问题 以及对此延伸出的一些需要了解的基本概念 ...... by 矜辰所致 完善文章内容结构,补充指令周期、机器周期等一些基本概念 2023/10/25前言 最近还是继续做着项目,因为在某 8051 内核芯片上使用到了 I…

MySQL篇---第四篇

系列文章目录 文章目录 系列文章目录一、并发事务带来哪些问题?二、事务隔离级别有哪些?MySQL的默认隔离级别是?三、大表如何优化?一、并发事务带来哪些问题? 在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对 同一数据进行操作…

Docker数据卷

目录 1.bind mount 2.docker managed volume 1.bind mount docker run -it --rm -v /tmp/data1:/data1 -v /tmp/data2:/data2:ro -v /etc/passwd:/mnt/passwd:ro busybox 2.docker managed volume docker run -d --name web1 webserver:v3 docker inspect web1 cd/var/lib/doc…

100042. 和为目标值的最长子序列的长度

给你一个下标从 0 开始的整数数组 nums 和一个整数 target 。 返回和为 target 的 nums 子序列中,子序列 长度的最大值 。如果不存在和为 target 的子序列,返回 -1 。 子序列 指的是从原数组中删除一些或者不删除任何元素后,剩余元素保持原…

系统日志记录注解方式动态记录

引入注解 <dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.9.1</version> </dependency> <dependency><groupId>org.aspectj</groupId><artifactId>aspec…

泰州市旅游景点门票预订管理系统 vue+uniapp微信小程序

本文从管理员、用户的功能要求出发&#xff0c;泰州市旅游景点管理小程序中的功能模块主要是实现用户、景点类型、景区信息、门票预定。经过认真细致的研究&#xff0c;精心准备和规划&#xff0c;最后测试成功&#xff0c;系统可以正常使用。分析功能调整与泰州市旅游景点管理…

leetcode经典面试150题---4.删除有序数组中的重复项II

目录 题目描述 前置知识 代码 方法一 双指针 思路 图解 实现 复杂度 题目描述 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&…

python 离线安装

1. 安装 pipreqs 包 # 使用清华源 pip install pipreqs -i https://pypi.tuna.tsinghua.edu.cn/simple # 使用豆瓣源 pip install pipreqs -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com # 使用阿里源 pip install pipreqs -i https://mirrors.aliyun.co…

[java/力扣110]平衡二叉树——优化前后的两种方法

分析 根据平衡二叉树的定义&#xff0c;只需要满足&#xff1a;1、根节点两个子树的高度差不超过1&#xff1b;2、左右子树都为平衡二叉树 代码 public class BalancedBinaryTree {public class TreeNode{int val;TreeNode left;TreeNode right;TreeNode(){}TreeNode(int va…

【OJ for Divide and Conquer】OJ题解

文章目录 A - Ultra-QuickSortB - Hanoi Tower Troubles Again! [找规律递归]C - Fibonacci Again[找规律]E - [Fire Net](https://programmerall.com/article/7276104269/)[DFS 搜索 ⭐⭐]F - Gridland[找规律]G - Maximum Subarray Sum[动态规划/分治..经典⭐]I - Quoit Desi…