在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树在内存管理中…

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

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

实验三 时序逻辑电路实验

仿真 链接: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数据库提供了丰富的数…

苹果笔记本能玩网页游戏吗 苹果电脑玩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 …

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

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

LDM论文解读

论文名称:High-Resolution Image Synthesis with Latent Diffusion Models 发表时间:CVPR2022 作者及组织:Robin Rombach, Andreas Blattmann, Dominik Lorenz,Patrick Esser和 Bjorn Ommer, 来自Ludwig Maximilian University of Munich &a…

独一无二的设计模式——单例模式(Java实现)

1. 引言 亲爱的读者们,欢迎来到我们的设计模式专题,今天的讲解的设计模式,还是单例模式哦!上次讲解的单例模式是基于Python实现(独一无二的设计模式——单例模式(python实现))的&am…

web全屏api,实现元素放大全屏,requestFullscreen,exitFullscreen

全屏api 主要方法 document.exitFullscreen(); 退出页面全屏状态,document是全局文档对象 dom.requestFullscreen(); 使dom进入全屏状态,异步,dom是一个dom元素 dom.onfullscreenchange(); 全…

专题四:Spring源码初始化环境与BeanFactory

上文我们通过new ClassPathXmlApplicationContext("applicationContext.xml");这段代码看了下Spring是如何将Xml里面内容注入到Java对象中,并通过context.getBean("jmUser");方式获得了一个对象实例,而避开使用new 来耦合。今天我们…

【TB作品】智能台灯控制器,ATMEGA128单片机,Proteus仿真

题目 8 :智能台灯控制器 基于单片机设计智能台灯控制器,要求可以调节 LED 灯的亮度,实现定时开启与关闭, 根据光照自动开启与关闭功能。 具体要求如下: (1)通过 PWM 功能调节 LED 灯亮度&#x…

娱乐圈发生震动,AI大模型技术已经取代了SNH48的小偶像?

自2023年以来,全球都被包裹在AI的惊天大潮之中,所有行业都在主动或被动地迎接改变。目前,各行业已经有大量公司正在把AI作为自身发展的最佳路径。其中,娱乐行业作为最被人们熟知的行业也在面对AI的发展时,发生着巨大变…

GMSB文章九:微生物的相关关系组间波动

欢迎大家关注全网生信学习者系列: WX公zhong号:生信学习者Xiao hong书:生信学习者知hu:生信学习者CDSN:生信学习者2 介绍 计算配对微生物在组间的相关关系波动情况进而评估不同分组的微生物状态。secom_linear 函数…

线性表与顺序存储结构(下)

前言 接上文(线性表与顺序存储结构(上))。 这些顺序存储结构的方法在顺序表上下卷中已经提到过,但是有些许不同,可以为理解顺序表提供更丰富的视角。(不过最主要的区别在于顺序表上下卷中的顺…

Python | 计算位涡平流项

写在前面 最近忙着复习、考试…都没怎么空敲代码,还得再准备一周考试。。。等考完试再慢慢更新了,今天先来浅更一个简单但是使用的python code 在做动力机制分析时,我们常常需要借助收支方程来诊断不同过程的贡献,其中最常见的一…