在node环境使用MySQL
什么是Sequelize?
Sequelize是一个基于Promise的NodeJS ORM模块
什么是ORM?
ORM(Object-Relational-Mapping)是对象关系映射
对象关系映射可以把JS中的类和对象,和数据库中的表和数据进行关系映射。映射之后我们就可以直接通过类和对象来操作数据表和数据了, 就不用编写SQL语句了,ORM有效的解决了直接在NodeJS中编写SQL不够直观, 不够高效, 容易出错等问题。
如何映射?
- 在Sequelize中JS中的一个类(一个模型)就对应数据库中的一张表
- 在Sequelize中JS中的一个对象就对应表中的一条数据(一条记录)
- 在Sequelize中JS中的一个对象的属性就对应一条数据的一个字段
|---------------------------|
| id | name | age |
| 1 | zs | 18 |
| 2 | ls | 19 |
|---------------------------|
// 1.创建一张表
cosnt 模型名称 = Sequelize.define('表名', {id: int,name: varchar(255),age: int
})
// 2.创建一条记录
let zs = 模型名称.build({id: 1,name: zs,age: 18
})// 3.操作表和数据
只要是通过Sequelize定义的模型(类), 那么Sequelize就会自动给这个模型添加很多操作表和数据的方法,以后我们就可以直接通过模型操作表, 通过模型创建出来的对象操作数据。
sequelize连接数据库
// 1.导入Sequelize
const Sequelize = require('sequelize');
// 2.配置连接信息
/*
第一个参数: 要操作的数据库名称
第二个参数: 数据库用户名
第三个参数: 数据库密码
第四个参数: 其它的配置信息
* */
const sequelize = new Sequelize('demo', 'root', 'root', {host: '127.0.0.1', // MySQL服务器地址port: 3306, // MySQL服务器端口号// 注意点: Sequelize不仅仅能操作MySQL还能够操作其它类型的数据库dialect: 'mysql', // 告诉Sequelize当前要操作的数据库类型pool: {max: 5, // 最多有多少个连接min: 0, // 最少有多少个连接idle: 10000, // 当前连接多久没有操作就断开acquire: 30000, // 多久没有获取到连接就断开}
});// 3.测试配置是否正确
sequelize.authenticate()
.then(()=>{console.log('ok');
})
.catch((err)=>{console.log(err);
});
什么是数据库连接池?
默认情况下有一个人要使用数据库,那么就必须创建一个连接,默认情况下有一个人不用数据库了, 为了不占用资源, 那么就必须销毁一个连接。但是频繁的创建和销毁连接是非常消耗服务器性能的, 所以为了提升服务器性能就有了连接池。
数据库连接池是负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。
sequelize创建表
- 字段说明常用属性
- type: 字段类型
- primaryKey: 是否是主键
- autoIncrement: 是否自动增长
- allowNull: 是否允许为空
- unique: 是否必须唯一
- defaultValue: 默认值
- 额外配置常用属性
- timestamps: 是否自动添加createdAt/updateAt字段
- freezeTableName: 是否禁止自动将表名修改为复用
- tableName: 是否自定义表名,一般不用
- indexes:
[ // 指定索引{name: '', // 索引名称fields: [''], // 索引字段名称} ]
实例:
/*
sequelize.define();
第一个参数: 用于指定表的名称
第二个参数: 用于指定表中有哪些字段
第三个参数: 用于配置表的一些额外信息
* */
/*
注意点:
1.sequelize在根据模型创建表的时候, 会自动将我们指定的表的名称变成复数
2.sequelize在根据模型创建表的时候, 会自动增加两个字段 createAt/updateAt
* */
let User = sequelize.define('user', {id: {type: Sequelize.INTEGER,primaryKey: true,autoIncrement: true},name: {type: Sequelize.STRING, // varchar(255)allowNull: false,unique: true},age: {type: Sequelize.TINYINT,defaultValue: 66},gender: {type: Sequelize.ENUM(['男', '女', '妖']),defaultValue: '妖'}
}, {freezeTableName: true, // 告诉sequelize不需要自动将表名变成复数// tableName: 'student', // 自定义表名,一般不用timestamps: false, // 不需要自动创建createAt/updateAt这两个字段indexes: [ // 指定索引{name: 'idx_age', // 索引名称fields: ['age'], // 索引字段名称}]
});// 注意点: 默认定义好一个模型之后并不会自动创建对应的表,我们需要通过调用连接对象的sync方法来执行同步,只有同步之后才会自动根据模型创建对应的表
sequelize.sync();
crud
增
// 下面这段代码 = 创建对象 + save();let u = await User.create({name: 'ww',age: 18,gender: '女'});console.log(u.dataValues);
查
在sequelize中,模型就代表着表,从表中查询数据,即从模型中查询数据:
let u = await User.findByPk(2);console.log(u);
改
User.update({name: 'zs'
},{where: {id: 2}
})
删
User.destroy({where: {id: 3}
});
条件查询
let us = await User.findAll({where: {// id: 1// age: {// [Sequelize.Op.gte] : 33// },// id: 7// ------上面逗号分隔是并且关系,下面是或者关系[Sequelize.Op.or]: {age: 33,id: 7}}
});
console.log(us.map(u => u.dataValues));
分页查询和排序
// 分页
let us = await User.findAll({offset: 2 // 跳过多少条数据});console.log(us.map(u => u.dataValues));let us = await User.findAll({limit: 2 // 取多少条数据});console.log(us.map(u => u.dataValues));let us = await User.findAll({offset: 2, // 跳过多少条数据limit: 2 // 取多少条数据});console.log(us.map(u => u.dataValues));// 排序let us = await User.findAll({order: [// ['id', 'desc']['age', 'desc'],['id', 'desc']]});console.log(us.map(u => u.dataValues));
Sequelize关联查询:
一对一
注意点:
- 只要建立了人和书的关系, 那么在查询人的时候, 就可以把拥有的那本书也查询出来
- 只要建立了书和人的关系, 那么在查询书的时候, 就可以把书属于哪个人也查询出来
- 如果没有建立相关的关系, 那么就不能查询出相关的内容
User.hasOne(Book, { // hasOne 谁拥有一个谁/ 一个人拥有一本书foreignKey: 'uId',sourceKey: 'id'});Book.belongsTo(User, { // belongsTo 谁属于一个谁 / 一本书属于一个人foreignKey: 'uId',sourceKey: 'id'});
let u = await User.findOne({where: {id: 1},// 注意点: 只要建立了表与表之间的关系, 那么在查询人的时候,就可以把这个人拥有的那本书也查询出来了include: {model: Book}
});
console.log(u.dataValues.book.dataValues);let b = await Book.findOne({where: {id: 1},// 注意点: 只要建立了表与表之间的关系, 那么在查询书的时候,就可以把这本书属于哪一个人也查询出来了include: {model: User}
});
console.log(b.dataValues.user.dataValues);
一对多
User.hasMany(Book, { // 一个人拥有多本书foreignKey: 'uId',sourceKey: 'id'
});
Book.belongsTo(User, { // 一本书属于一个人foreignKey: 'uId',sourceKey: 'id'
})
// 关联查询
let u = await User.findOne({where: {id: 1},include: {model: Book}
});
console.log(u.dataValues.books.map(b=>b.dataValues));let b = await Book.findOne({where: {id: 3},include: {model: User}
});
console.log(b.dataValues.user.dataValues);
多对多
// 创建模型
let Student = sequelize.define('student', {id: {type: Sequelize.INTEGER,primaryKey: true,autoIncrement: true},name: {type: Sequelize.STRING, // varchar(255)allowNull: false,unique: true}
}, {freezeTableName: true, // 告诉sequelize不需要自动将表名变成复数// tableName: 'student', // 自定义表名timestamps: false // 不需要自动创建createAt/updateAt这两个字段
});let Teacher = sequelize.define('teacher', {id: {type: Sequelize.INTEGER,primaryKey: true,autoIncrement: true},name: {type: Sequelize.STRING, // varchar(255)allowNull: false,unique: true}
}, {freezeTableName: true, // 告诉sequelize不需要自动将表名变成复数// tableName: 'student', // 自定义表名timestamps: false // 不需要自动创建createAt/updateAt这两个字段
});let Relation = sequelize.define('relation', {studentId: {type: Sequelize.INTEGER,allowNull: false,references: {model: Student,key: 'id'}},teacherId: {type: Sequelize.INTEGER,allowNull: false,references: {model: Student,key: 'id'}}
}, {freezeTableName: true, // 告诉sequelize不需要自动将表名变成复数// tableName: 'student', // 自定义表名timestamps: false // 不需要自动创建createAt/updateAt这两个字段
});
// 建立查询关系
Student.belongsToMany(Teacher, { // 一个学生属于多个老师through: Relation
});
Teacher.belongsToMany(Student, { // 一个老师属于多个学生through: Relation
});sequelize.sync();
// 关联查询
/*
let s = await Student.findOne({where: {id: 1},include: {model: Teacher}
});
console.log(s.dataValues.teachers.map(t=>t.dataValues));*/
let t = await Teacher.findOne({where: {id: 1},include: {model: Student}
});
console.log(t);
Sequelize-Cli
什么是Sequelize-CLI?
- 在编程开发中为了能够更好的管理代码, 我们可以使用Git来管理我们的代码,
实现对代码变更的追踪, 实现在各个不同版本之间切换 - 在数据库开发中为了能够更好的管理数据库, 我们也可以使用数据库迁移工具来管理我们的数据库,
实现对数据库变更的追踪, 实现在各个不同版本之间切换 - Sequelize-CLI就是一款数据库迁移工具, 能够让我们追踪数据库的变更, 在各个不同版本之间随意切换
相关文章:

在node环境使用MySQL
什么是Sequelize? Sequelize是一个基于Promise的NodeJS ORM模块 什么是ORM? ORM(Object-Relational-Mapping)是对象关系映射 对象关系映射可以把JS中的类和对象,和数据库中的表和数据进行关系映射。映射之后我们就可以直接通过类和对象来操作数据表和数据了, 就…...

spdlog一个非常好用的C++日志库(四): 源码分析之logger类
目录 1.简介 2.类图关系 3.logger数据成员 4.logger函数成员 4.1.构造与析构 4.1.1.构造函数 4.1.2.拷贝构造、移动构造 4.2.交换操作 4.3.log()记录日志消息 4.3.1.格式串 4.3.2.普通字符串 4.3.3.日志级别 4.3.4.宽字符支持 4.4.sink_it_:将log消息…...

逻辑这回事(七)---- 器件基础
Xilinx FPGA创建了先进的硅模块(ASMBL)架构,以实现FPGA具有针对不同应用程序领域优化的各种功能组合的平台。通过这一创新,Xilinx提供了更多的设备选择,使客户能够为其特定设计选择具有正确的功能和功能组合的FPGA。ASMBL体系结构通过以下方式突破了传统的设计障碍:消除几…...

中俄汽车产业链合作前景广阔,东方经济论坛助力双边合作与创新
随着中国汽车零部件企业的竞争力和创新能力不断增强,中国汽车及零部件行业在俄罗斯的市场份额和品牌影响力显著提升,中俄两国在汽车产业链上的合作展现出巨大的潜力和广阔的前景。2024年5月,俄罗斯乘用车新车销量达到12.8万辆,同比…...

第六篇:精通Docker Compose:打造高效的多容器应用环境
精通Docker Compose:打造高效的多容器应用环境 1. 引言 1.1 目的与重要性 在现代软件开发中,随着应用程序的复杂性不断增加,传统的单一容器部署方式已无法满足需求。Docker Compose作为一种强大的工具,专门用于定义和运行多容器…...

C++视觉开发 一.OpenCV环境配置
一.OpenCV安装环境配置 1.OpenCV安装 (1)下载 官方下载链接:http://opencv.org/releases 这边选择需要的版本,我是在windows下的4.9.0。(科学上网下载很快,否则可能会有点慢) (2)安装 双击下…...

大数据面试题之Kafka(3)
目录 Kafka支持什么语义,怎么实现ExactlyOnce? Kafka的消费者和消费者组有什么区别?为什么需要消费者组? Kafka producer的写入数据过程? Kafka producer的ack设署 Kafka的ack机制,解决了什么问题? Kafka读取消息是推还是拉的模式?有什…...

视频监控平台web客户端的免密查看视频页:在PC浏览器上如何调试手机上的前端网页(PC上的手机浏览器的开发者工具)
目录 一、手机上做前端页面开发调试 1、背景 2、视频监控平台AS-V1000的视频分享页 3、调试手机前端页面代码的条件 二、手机端的准备工作 1、手机准备 2、手机的开发者模式 3、PC和手机的连接 (1)进入调试模式 (2)选择…...

力扣2488.统计中位数为 K 的子数组
力扣2488.统计中位数为 K 的子数组 等价转换 子数组为奇数 : 左小 右小 左大 右大 左小 – 左大 右大 – 右小 子数组为偶数 : 左小 右小 左大 右大 – 1 左小 – 左大 右大 – 右小 - 1提示中说明k为两数中左边那个 先从k的下标pos开始往左逆序…...

Zabbix对接Elasticsearch(ES)数据库(未成功)
0.需求分析 不管zabbix的后端数据库是oracle还是mysql,当zabbix监控的量级达到了一定程度后,那么对数据库的性能是一个非常严峻的挑战。特别是对历史数据的查询,将会变得非常非常的慢,别告诉我可以建索引优化,当量级达…...

【unity实战】使用Unity实现动作游戏的攻击 连击 轻重攻击和打击感
最终效果 文章目录 最终效果前言素材下载:玩家移动跳跃控制攻击动画配置轻攻击重攻击 攻击时禁止移动和攻击移动补偿敌人击退和播放受击动画受击特效攻击停顿和屏幕震动局部顿帧(补充)参考源码完结 前言 注意本文为自己的学习记录笔记&#…...

ELK 企业实战7
ELKkafkafilebeat企业内部日志分析系统 1、组件介绍 1、Elasticsearch: 是一个基于Lucene的搜索服务器。提供搜集、分析、存储数据三大功能。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的ÿ…...

linux 下neo4j的安装
一、neo4j简介 Neo4j 是一个高性能的 NoSQL 图形数据库,它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j 也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。 neo4j与jdk版本对应 neo4j的版本需要与jdk版本相适配,否则容易出现安装失…...

Flink ProcessFunction不同流异同及应用场景
ProcessFunction系列对比概览 函数类别关键特性应用场景示例ProcessFunction基础类,处理单个事件,支持事件时间、水位线、状态管理、定时器。单独处理每个事件,执行复杂逻辑,如基于事件内容动态响应。KeyedProcessFunction基于键…...

Matplotlib 文本
可以使用 xlabel、ylabel、text向图中添加文本 mu, sigma 100, 15 x mu sigma * np.random.randn(10000)# the histogram of the data n, bins, patches plt.hist(x, 50, densityTrue, facecolorg, alpha0.75)plt.xlabel(Smarts) plt.ylabel(Probability) plt.title(Histo…...

信创产业政策,信创测试方面
信创产业的政策支持主要体现在多个方面,这些政策旨在推动产业的快速发展,加强自主创新能力,保障国家信息安全,以及促进产业结构的优化升级。 首先,政府通过财政支持、税收优惠等方式,加大对信创产业的资金…...

微信云数据库迁移到unicloud云数据库
背景 早期只有一个微信小程序,后来了解到uniapp的跨端解决方案,开始从小程序代码迁移到uniapp。对于后端采用的微信云开发方案,迁移的时候主要要解决从openid的用户体系转移到unicloud提供的uni-id体系(使用uid)。 方案 利用微信云数据库的…...

快速上手文心一言指令
“文心一言”指的是百度公司开发的自然语言处理与生成技术,它类似于ChatGPT,是一种基于大规模语言模型的AI对话系统,能够理解和生成自然语言文本,进行问答、创作等多种任务。由于“文心一言”是一个复杂的系统,其内部指…...

零基础STM32单片机编程入门(五)FreeRTOS实时操作系统详解及实战含源码视频
文章目录 一.概要二.什么是实时操作系统三.FreeRTOS的特性四.FreeRTOS的任务详解1.任务函数定义2.任务的创建3.任务的调度原理 五.CubeMX配置一个FreeRTOS例程1.硬件准备2.创建工程3.调试FreeRTOS任务调度 六.CubeMX工程源代码下载七.讲解视频链接地址八.小结 一.概要 FreeRTO…...

leetCode.96. 不同的二叉搜索树
leetCode.96. 不同的二叉搜索树 题目思路 代码 // 方法一:直接用卡特兰数就行 // 方法二:递归方法 class Solution { public:int numTrees(int n) {// 这里把 i当成整个结点,j当成左子树最左侧结点,并一次当根节点尝试// f[ i ] f[ j - 1…...

PyAutoGUI 使用详解
文章目录 简介PyAutoGUI 的原理安装 PyAutoGUI基本使用示例鼠标控制键盘控制截屏图像识别消息框 高级功能防止误操作多屏幕支持鼠标平滑移动 结论 简介 PyAutoGUI 是一个用于自动化控制鼠标和键盘的 Python 库。它可以帮助开发者编写脚本,以模拟用户在计算机上的操…...

MySQL——备份
为什么要备份? 保证重要的数据不丢失 方便数据转移 MySQL数据库备份方式: 1. 直接拷贝物理文件 2. 在可视化工具中手动导出 —— 在想要导出的表或者库中,右键选择备份或导出 3. 使用命令行导出 mysqldump ——cmd打开命令行 —…...

科东软件精彩亮相华南工博会,展现未来工业前沿技术
近日,华南国际工业博览会在深圳成功举办。科东软件携众多前沿技术、解决方案及最新应用案例精彩亮相,为参展观众带来了一场工业智能的科技盛宴。 鸿道操作系统(Intewell) 科东软件重点展示了鸿道操作系统(Intewell&…...

详解flink sql, calcite logical转flink logical
文章目录 背景示例FlinkLogicalCalcConverterBatchPhysicalCalcRuleStreamPhysicalCalcRule其它算子FlinkLogicalAggregateFlinkLogicalCorrelateFlinkLogicalDataStreamTableScanFlinkLogicalDistributionFlinkLogicalExpandFlinkLogicalIntermediateTableScanFlinkLogicalInt…...

PostgreSQL的系统视图pg_statio_all_indexes
PostgreSQL的系统视图pg_statio_all_indexes 在 PostgreSQL 数据库中,pg_statio_all_indexes 视图提供了有关所有索引的 I/O 活动的统计信息。这些统计信息对于了解索引的使用情况和性能调优非常有帮助。 pg_statio_all_indexes 视图的结构 以下是 pg_statio_all…...

【C++ Primer Plus学习记录】函数和C-风格字符串
将字符串作为参数时意味着传递的是地址,但可以使用const来禁止对字符串参数进行修改。 假设要将字符串作为参数传递给函数,则表示字符串的方式有三种: (1)char数组 (2)用引号括起来的字符串常…...

力扣双指针算法题目:移动零
1.题目 . - 力扣(LeetCode) 2.思路解析 这个题目的思路和“使用递归排序快速排序解决数组的排序问题”相同 class solution { public:void QuickSort(vector<int>& nums, int left, int right){if (left > right) return;int key left…...

day60---面试专题(微服务面试题-参考回答)
微服务面试题 **面试官:**Spring Cloud 5大组件有哪些? 候选人: 早期我们一般认为的Spring Cloud五大组件是 Eureka : 注册中心Ribbon : 负载均衡Feign : 远程调用Hystrix : 服务熔断Zuul/Gateway : 网关 随着SpringCloudAlibba在国内兴起 , …...

laravel+phpoffice+easyexcel实现导入
资源包下载地址 https://download.csdn.net/download/QiZong__BK/89503486 easy-excel下载: "dcat/easy-excel": "^1.0", 命令行: composer require dcat/easy-excel 前端代码 <!doctype html> <html lang"en&…...

Spring Boot集成多数据源的最佳实践
Spring Boot集成多数据源的最佳实践 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 为什么需要多数据源? 在实际的应用开发中,有时候…...