Sequelize:Node.js 中的强大 ORM 框架

news2024/11/20 3:26:00

❤️砥砺前行,不负余光,永远在路上❤️

目录

    • 前言
      • 优势:提高效率,不用SQL即可完成数据库操作。
    • 那什么是 Sequelize?
    • 主要特性:
      • 1、模型定义和映射:
      • 2、关联和联接:
      • 3、事务管理:
      • 4、查询构建:
      • 5、数据验证:
    • 详细使用示例:
      • 一、创建数据库连接实例
      • 二、定义模型
        • 1、models/index.js文件
      • 三、针对数据库已经建好的表可以使用sequelize-auto 自动生成模型
        • 1、安装sequelize-auto,以及mysql2
        • 2、终端执行指令生成models
      • 四、express中引入使用
      • 五、Sequelize实现增删改查
        • 1、创建数据
        • 2、删除数据
        • 3、修改数据
        • 4、查找数据/分页模糊查询
        • 5、查找所有findAll
        • 6、查找某一条数据findone
        • 7、关联查询后续补充。
      • 六、更多用法

前言

在现代的 Web 开发中,与数据库进行交互是常见的任务。为了简化和加速与数据库的交互过程,许多开发人员选择使用 ORM(对象关系映射)框架。ORM 框架提供了一种将数据库记录映射到对象的方式,使开发人员可以使用面向对象的编程方式来处理数据库操作。在 Node.js 生态系统中,Sequelize 是一个备受青睐的 ORM 框架,本文将介绍 Sequelize 的特性和用法。

优势:提高效率,不用SQL即可完成数据库操作。

那什么是 Sequelize?

Sequelize 是一个基于 Promise 实现的 Node.js ORM 框架,用于与关系型数据库进行交互。它支持多种数据库,包括 PostgreSQL、MySQL、SQLite 和 MSSQL。Sequelize 提供了强大的功能,如模型定义、关联、事务管理、查询构建和数据验证等。

主要特性:

1、模型定义和映射:

Sequelize 允许您通过定义模型来映射数据库表。模型是 JavaScript 类,代表了一个数据库表的结构和行为。通过模型,您可以轻松地进行 CRUD(创建、读取、更新、删除)操作。

2、关联和联接:

Sequelize 提供了丰富的关联功能,使您能够在不同的模型之间建立关系,如一对一、一对多和多对多关系。这使得在查询时可以轻松地跨表进行联接操作,提供了更强大的数据检索和操作能力。

3、事务管理:

Sequelize 支持事务,这是在复杂的数据库操作中至关重要的功能。通过使用事务,您可以确保一系列数据库操作的原子性,要么全部成功,要么全部失败。这对于确保数据的完整性和一致性非常重要。

4、查询构建:

Sequelize 提供了强大而灵活的查询构建功能,使您可以使用链式调用方式构建复杂的查询。您可以使用简单的方法链和条件表达式来过滤、排序、分页和聚合数据,以满足各种查询需求。

5、数据验证:

Sequelize 具有内置的数据验证机制,可以在模型定义中指定字段的验证规则。这样,您可以确保在将数据保存到数据库之前进行有效性检查,并且可以轻松地处理输入数据的验证和清理。

详细使用示例:

下面是一个简单的示例,展示了如何使用 Sequelize 进行数据库操作:

一、创建数据库连接实例

我这里简单的对Sequelize 处理了一下,将配置单独提取到了config文件下

/*
 * @Date: 2023-05-24 09:23:47
 * @LastEditTime: 2023-05-24 16:09:13
 */
//1.导入Sequelize模块
const Sequelize = require('sequelize')
const { dbConfig } = require('../config/index')
const { database, user, password, options } = dbConfig


//new Sequelize('数据库名','用户名','密码',{配置信息})
//2.使用sequelize模块配置和数据库的连接信息:创建连接数据库的对象
const mysql_Sequelize = new Sequelize(database, user, password, options)
//3.导出数据库的连接对象
module.exports = mysql_Sequelize;

二、定义模型

一般在项目中会统一管理Models 在项目根目录有一个models文件夹,通过index集中管理,单独的models文件如下图。

1、models/index.js文件

const coon = require('../utils/sequelize')
const { Sequelize } = require("sequelize");


const User = require('./user')(coon, Sequelize) //用户表
const Room = require('./room')(coon, Sequelize) //房间表
const Record = require('./record')(coon, Sequelize) //房间记录表
const RoomUser = require('./room_user')(coon, Sequelize)
const Standings = require('./standings')(coon, Sequelize)  //战绩表

module.exports = {
	User, Room, RoomUser, Record, Standings
};

在这里插入图片描述

在这里插入图片描述

三、针对数据库已经建好的表可以使用sequelize-auto 自动生成模型

使用方法如下:

1、安装sequelize-auto,以及mysql2

cnpm install sequelize-auto
cnpm install mysql2

//or

yarn add sequelize-auto
yarn add mysql2

2、终端执行指令生成models

sequelize-auto -h 127.0.0.1 -d play-record -u root -x  123456
sequelize-auto -h 主机地址 -d 数据库名称 -u 用户名 -x  密码

执行完成命令会在当前目录生成一个models/ 下面的所有 文件就是我们需要的。
在这里插入图片描述

四、express中引入使用

router文件中引入 定义好的models即可。

const { literal, Op, Sequelize } = require("sequelize");
const { User, Room, RoomUser, Record, Standings } = require('../models/index')

在这里插入图片描述

五、Sequelize实现增删改查

1、创建数据

创建数据使用create()

router.post('/insert/article', async (req, response, next) => {
	const { title, content, userId, inputValue } = req.body
	try {
		const res = await Article.create({ id: uuid(), title, content, userId, inputValue })
		response.send(success(res))
	} catch (error) {
		response.send(fail(error))
	}
});

2、删除数据

删除使用destroy()

/* 删除文章 */
router.post('/delete/article', async (req, response, next) => {
	const { id } = req.body
	try {
		const data = await Article.destroy({ where: { id } }); //直接删除
		response.send(success(data))
	} catch (error) {
		response.send(fail(error))
	}
});

3、修改数据

修改使用update

router.post('/update/article', async (req, response, next) => {
	const { id, title, content, inputValue } = req.body
	try {
		const data = await Article.update({ title, content, inputValue }, { where: { id } });
		response.send(success(data))
	} catch (error) {
		response.send(fail(error))
	}
});

4、查找数据/分页模糊查询

/* 分页查询 */
/* 获取文章列表 */
router.post('/article/list', async (req, response, next) => {
	const { title, pageSize, pageNum } = req.body
	try {
		let data = await Article.findAndCountAll({
			where: {
				title: {
					[Op.like]: `%${title || ''}%`
				},
			},
			order: [['createTime', 'desc']],
			limit: pageSize || 10,
			offset: ((pageNum || 1) - 1) * (pageSize || 10),
		});
		response.send(success(data))
	} catch (error) {
		response.send(fail(error))
	}
});

5、查找所有findAll

/* 获取所有文章 */
router.post('/get/article/list/all', async (req, response, next) => {
	try {
		const data = await Article.findAll(); //获取所有
		response.send(success(data))
	} catch (error) {
		response.send(fail(error))
	}
});

6、查找某一条数据findone

/* 获取文章详情 */
router.post('/article/details', async (req, response, next) => {
	const { id } = req.body
	try {
		const data = await Article.findOne({
			where: { id }
		});
		response.send(success(data))
	} catch (error) {
		response.send(fail(error))
	}
});

7、关联查询后续补充。

六、更多用法

官网地址:https://www.sequelize.cn/

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

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

相关文章

Java性能权威指南-总结2

Java性能权威指南-总结2 性能测试方法原则2:理解批处理流逝时间、吞吐量和响应时间批处理流逝时间吞吐量测试 原则3:用统计方法应对性能的变化 性能测试方法 原则2:理解批处理流逝时间、吞吐量和响应时间 性能测试的第2条原则是多角度审视应用性能。应该测量哪个指标取决于对…

chatgpt赋能python:Python中的与非

Python中的与非 在Python编程中,我们经常会用到与非运算符,用来判断条件语句中的真假性。在本文中,我们将介绍Python中的与非运算符,并探讨其用法和实际应用场景。 什么是与非运算符? 与非运算符是一个布尔操作符&a…

NeRF-SLAM代码记录

前言 没运行成功,尤其是编译gtsam部分,每一步都有错,又是讨厌c++第一天。 这一行编译到92% 就会报错 python/CMakeFiles/gtsam_py.dir/build.make:250: recipe for target python/CMakeFiles/gtsam_py.dir/linear.cpp.o failed make[2

.NET 8 Preview 4 发布

作者:Jon Douglas - Principal Program Manager, NuGet 翻译:Alan Wang 排版:Alan Wang 我们很高兴与大家分享在 .NET 8 预览版 4 中的所有新功能和改进!这次发布是继预览版 3之后的更新。您将在这些月度发布中看到更多功能逐渐亮…

【无标题】win11打开VMware虚拟机蓝屏解决

win11打开VMware虚拟机蓝屏解决 win11打开虚拟机蓝屏!!!解决方案:win11支持16.2以上版本,其他版本不兼容,可用文末的卸载工具卸载之前已安装版本(深度卸载),然后下载16.2…

chatgpt赋能python:Python中的乘号:一个重要的数学运算符

Python中的乘号:一个重要的数学运算符 在 Python 编程语言中,乘号通常是使用“*”表示的数学运算符。这个运算符非常常用,它可以在各种情况下使用。本文将探讨 Python 中乘号的基本用法,以及更高级的用法。 基本用法 在 Python…

python+django高校人事管理系统vue

本高校人事管理系统以Django作为框架,Python语言,B/S模式以及MySql作为后台运行的数据库。本系统主要包括以下功能模块:用户、院长、职称申报、工资信息、绩效信息、奖惩信息、招聘、科系分类等模块。 本文着重阐述了高校人事管理系统的分析、…

easyX实践上手操作小项目

easyX实践上手操作小项目 效果展示主菜单的装饰玩法介绍界面开始游戏界面制作团队界面排行榜界面注:main()函数拓展数据库小结 这里我们学习过easyX的基础知识后,看看是否能实践操作一下,制作一个属于自己的游戏界面呢? 基础知识…

基于深度学习的高精度野生目标检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于深度学习的高精度野生目标检测识别系统可用于日常生活中检测与定位野生目标目标,利用深度学习算法可实现图片、视频、摄像头等方式的野生目标目标检测识别,另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测…

开源SCRM营销平台MarketGo-账号管理

一、概述 企业在经营的过程中,因为业务、税收等各种因素的需要在各地成立分公司,这样针对公司来说管理成本,运营成本,营销成本都会提高,并且沟通的效率也会变低。 在用户营销的场景中,MarketGo在SCRM做了…

C++ stack容器介绍

🤔stack容器介绍: 📖 stack是一种数据结构,也可以被称为堆栈。它是一个容器,只允许在最顶层进行插入和删除,并且只能访问最后一个插入的元素。这个元素称为栈顶。所有新插入的元素都被放置在栈顶上面&#…

【C++入门】什么是引用

目录 一、引用概念 二、引用特性 三、常引用 四、使用场景 1. 做参数 2. 做返回值 五、传值,传引用效率比较 六、引用和指针的区别 一、引用概念 引用不是新定义一个变量,而是给已存在变量取一个别名,编译器不会为引用变量开辟内存空间…

【C/C++】之内存管理(超详细练气篇)

个人主页:平行线也会相交💪 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【C之路】💌 本专栏旨在记录C的学习路线,望对大家有所帮助🙇‍ 希望我们一起努力、成长&…

AI绘画能力的起源:通俗理解VAE、扩散模型DDPM、DETR、ViT/Swin transformer

前言 2018年我写过一篇博客,叫:《一文读懂目标检测:R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD》,该文相当于梳理了2019年之前CV领域的典型视觉模型,比如 2014 R-CNN2015 Fast R-CNN、Faster R-CNN2016 YOLO、SSD2…

Seata 分布式事务-应用实例

Seata 分布式事务-应用实例 需求分析/图解 需求:完成下订单功能,由三个微服务模块协同完成, 涉及到多数据库, 多张表 分析 黑色线是执行顺序线 红色线是想Seata Server注册 最后紫色线是决定是否提交和回滚 项目目录 主题包结构都是一样的但是类名字…

eventfd 和 epoll 的结合使用

一.eventfd介绍 eventfd 是 Linux 的一个系统调用&#xff0c;创建一个文件描述符用于事件通知&#xff0c;自 Linux 2.6.22 以后开始支持。 接口及参数介绍 #include <sys/eventfd.h> int eventfd(unsigned int initval, int flags);eventfd() 创建一个 eventfd 对象&…

spring cloud Alibaba之Nacos Discovery--服务治理 (二)

接着上一篇文章 搭建的微服务环境, 实现nacos 注册中心实战操作案例 一. 服务治理介绍 先来思考一个问题 通过上一章的操作&#xff0c;我们已经可以实现微服务之间的调用。但是我们把服务提供者的网络地址 &#xff08;ip&#xff0c;端口&#xff09;等硬编码到了代码中&a…

【SpringCloud】SpringAMQP

文章目录 1、AMQP2、基本消息模型队列3、WorkQueue模型4、发布订阅模型5、发布订阅-Fanout Exchange6、发布订阅-DirectExchange7、发布订阅-TopicExchange 1、AMQP Advanced Message Queuing Protocol&#xff0c;高级消息队列协议。是用于在应用程序之间传递业务消息的开放标…

ElasticSearch安装部署——超详细

ElasticSearch安装部署 简介 全文搜索属于最常见的需求&#xff0c;开源的 Elasticsearch &#xff08;以下简称 es&#xff09;是目前全文搜索引擎的首选。 它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Github 都采用它。 Elasticsearch简称es&…

JS中手撕防抖函数和节流函数

1.防抖函数 1.1定义 说明&#xff1a;在一定时间内&#xff0c;频繁执行事件&#xff0c;只执行最后一次函数。(英雄联盟回城) 1.2步骤&#xff1a; 声明定时器函数判断是否有定时器函数&#xff0c;如果有定时器函数的话就清除定时器。。如果没有定时器函数的话&#xff0…