在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创建表

  1. 字段说明常用属性
  • type: 字段类型
  • primaryKey: 是否是主键
  • autoIncrement: 是否自动增长
  • allowNull: 是否允许为空
  • unique: 是否必须唯一
  • defaultValue: 默认值
  1. 额外配置常用属性
  • 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就是一款数据库迁移工具, 能够让我们追踪数据库的变更, 在各个不同版本之间随意切换

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

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

相关文章

join()方法——连接字符串、元组、列表和字典

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 join()方法用于连接字符串数组。将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串&#…

喜报 | 极限科技获得北京市“创新型”中小企业资格认证

2024年6月20日,北京市经济和信息化局正式发布《关于对2024年度4月份北京市创新型中小企业名单进行公告的通知》,极限数据(北京)科技有限公司凭借其出色的创新能力和卓越的企业实力,成功获得“北京市创新型中小企业”的…

学会python——在excel中写入数据(python实例十三)

目录 1.认识Python 2.环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3 .想Excel中写入数据 3.1 代码构思 3.2 代码实例 3.3 运行结果 4.总结 1.认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的…

数据结构算法之B树

一、绪论 1.1 数据结构的概念和作用 1.2 B树的起源和应用领域 二、B树的基本原理 2.1 B树的定义和特点 2.2 B树的结构和节点组成 2.3 B树的插入 2.4 B树的删除操作 三、B树的优势和应用 3.1 B树在数据库系统中的应用 3.2 B树在文件系统中的应用 3.3 B树在内存管理中…

HTML5的多线程技术:Shared Worker的使用示例

Shared Worker 与普通的 Web Worker 类似,但不同之处在于它可以被多个浏览器窗口、标签页或者iframe共享,使得这些上下文之间能够相互通信。下面是一个使用 Shared Worker 的完整示例。共享Worker脚本(sharedWorker.js) self.add…

isupper()方法——判断字符串是否全由大写字母组成

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 isupper()方法用于判断字符串中所有的字母是否都是大写。isupper()方法的语法格式如下: str.isupper() 如果字符串中包含至少…

我是如何在bytemd中实现自定义目录的

介绍 接着上文说完,实现了在markdown编辑器中插入视频的能力,接下来还需要继续优化 markdown文档的阅读体验,比如 再加个目录 熟悉markdown语法的朋友可能会说,直接在编辑时添加 toc 标签,可以在文章顶部自动生成目录…

实验三 时序逻辑电路实验

仿真 链接:https://pan.baidu.com/s/1z9KFQANyNF5PvUPPYFQ9Ow 提取码:e3md 一、实验目的 1、通过实验,理解触发的概念,理解JK、D等常见触发器的功能; 2、通过实验,加深集成计数器功能的理解,掌…

⭐Ollama的本地安装⚡

先来逛一下咱们的主角Ollama的官网地址: Ollama 大概长这个样子🤔 因为本地系统的原因,文章只提供Widows的安装方式,使用Linux和Mac的大佬,可以自行摸索🧐 下载完成后就是安装了🍕&#xff0c…

一、Redis简介

一、Redis介绍与一般应用 1.1 基本了解 Redis全称Remote Dictionary Server(远程字典服务), 是一个开源的高性能键值存储系统,通常用作数据库、缓存和消息代理。使用ANSI C语言编写遵守BSD协议,是一个高性能的Key-Value数据库提供了丰富的数…

JVM性能监控与调优:生产环境的实践指南

JVM性能监控与调优:生产环境的实践指南 一、引言 在生产环境中,Java应用程序的性能监控和调优是确保系统稳定运行、提升用户体验的关键环节。JVM(Java Virtual Machine)作为Java应用程序的运行环境,其性能直接影响到…

Flink 本地任务添加配置参数

Flink 本地任务添加配置参数 配置一个Configuration,然后通过StreamExecutionEnvironment.getExecutionEnvironment(configuration)传入。 例如: Configuration configuration new Configuration();configuration.set(RestartStrategyOptions.RESTART_…

苹果笔记本能玩网页游戏吗 苹果电脑玩steam游戏怎么样 苹果手机可以玩游戏吗 mac电脑安装windows

苹果笔记本有着优雅的机身、强大的性能,每次更新迭代都备受用户青睐。但是,当需要使用苹果笔记本进行游戏时,很多人会有疑问:苹果笔记本能玩网页游戏吗?苹果笔记本适合打游戏吗?本文将讨论这两个话题&#…

6-14题连接 - 高频 SQL 50 题基础版

目录 1. 相关知识点2. 例子2.6. 使用唯一标识码替换员工ID2.7- 产品销售分析 I2.8 - 进店却未进行过交易的顾客2.9 - 上升的温度2.10 - 每台机器的进程平均运行时间2.11- 员工奖金2.12-学生们参加各科测试的次数2.13-至少有5名直接下属的经理2.14 - 确认率 1. 相关知识点 left …

JavaScript——属性的检测和枚举

目录 任务描述 相关知识 属性的检测 属性的枚举 编程要求 任务描述 本关任务:给定一个属性的名字,请先判断它属于哪一个对象,然后返回该对象的所有自有属性名连接成的字符串。 如:school对象有三个自有属性name,location,s…

达梦数据库系列—15. 表的备份和还原

目录 1、表备份 2、表还原 1、表备份 表备份和表还原恢复,都必须在联机状态下进行。 与备份数据库与表空间不同,不需要备份归档日志,不存在增量备份之说。 CREATE TABLE TAB_FOR_RES_02(C1 INT);CREATE INDEX I_TAB_FOR_RES_02 ON TAB_F…

树状数组——点修区查与区修点查

树状数组是一种代码量小,维护区间的数据结构 他可以实现: 1.区间修改,单点查询 2.单点修改,区间查询 当然,二者不可兼得,大人全都要的话,请选择线段树 前置知识: lowbit(x)操作…

如何安装和配置Monit

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 关于 Monit Monit 是一个有用的程序,可以自动监控和管理服务器程序,以确保它们不仅保持在线,而且文…

Java与前端框架集成开发指南

Java与前端框架集成开发指南 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 引言 在当今互联网应用开发中,Java作为一种强大的后端语言&#xff0…

程序人生 - (002)

作为一名程序员,在编程和软件开发的过程中,通常会有一些深刻的感悟和体会。这些感悟不仅仅是关于技术的,也包括对工作的态度、职业的发展和人生的理解。 代码即逻辑:编写代码不仅仅是使用编程语言,更重要的是用逻辑思维…