当前位置: 首页 > news >正文

基于 Node.js 的 ORM(对象关系映射)工具——Sequelize介绍与使用,并举案例分析

便捷性介绍

支持多种数据库,包括 PostgreSQL、MySQL、MariaDB、SQLite 和 Microsoft SQL Server。Sequelize 提供了丰富的功能,帮助开发者用 JavaScript(或 TypeScript)代码操作数据库,而无需直接书写 SQL 语句。

Sequelize 的主要特点

跨数据库支持:支持主流数据库如 MySQL、PostgreSQL、SQLite 等。
模型(Model)定义:通过定义模型(类似于类),对应数据库的表。
迁移(Migrations)工具:方便管理数据库的版本变化。
事务支持:提供事务操作,确保数据一致性。
查询生成器:支持链式查询和条件查询,生成高效的 SQL 语句。
钩子(Hooks):支持生命周期钩子,方便在特定操作前后执行代码。

基本使用介绍

安装 Sequelize 和数据库驱动

npm install sequelize
npm install mysql2 # 对于 MySQL

创建实例

const { Sequelize } = require('sequelize');// 创建与数据库的连接实例
const sequelize = new Sequelize('database_name', 'username', 'password', {host: 'localhost',dialect: 'mysql', // 数据库类型,可更换为 'postgres', 'sqlite', 'mssql' 等logging: false,  // 是否打印 SQL 日志
});

同步模型到数据库

将模型与数据库表同步

(async () => {try {await sequelize.authenticate(); // 验证连接是否成功console.log('连接建立成功');await sequelize.sync({ force: true }); // 同步模型,`force: true` 表示重建表console.log('所有异步模型成功.');} catch (error) {console.error('不能连接到数据库', error);} finally {await sequelize.close(); // 关闭数据库连接}
})();

定义模型:(相当于是在建数据表)

模型是 Sequelize 的核心,用来描述数据库的表结构

const { DataTypes } = require('sequelize');const User = sequelize.define('User', {id: {type: DataTypes.INTEGER,autoIncrement: true,primaryKey: true,},username: {type: DataTypes.STRING,allowNull: false,},email: {type: DataTypes.STRING,unique: true,},password: {type: DataTypes.STRING,},
}, {tableName: 'users', // 指定表名timestamps: true,  // 是否自动生成 createdAt 和 updatedAt 字段
});

数据操作(增删改查)

//创建数据
const newUser = await User.create({username: 'JohnDoe',email: 'johndoe@example.com',password: '123456',
});
console.log(newUser.toJSON());// 查询所有用户
const users = await User.findAll();
console.log(users);// 按条件查询
const specificUser = await User.findOne({ where: { username: 'JohnDoe' } });
console.log(specificUser);//更新数据
await User.update({ email: 'newemail@example.com' }, {where: { username: 'JohnDoe' },
});//删除数据
await User.destroy({where: { username: 'JohnDoe' },
});

其他基本数据库操作

关联(Associations)

Sequelize 支持表之间的关系:一对一 (1:1)、一对多 (1:N)、多对多 (N:M)。

const Post = sequelize.define('Post', { title: DataTypes.STRING });
User.hasMany(Post);  // 一个用户有多个帖子
Post.belongsTo(User); // 一个帖子属于一个用户

事务(Transactions)

const t = await sequelize.transaction();try {const user = await User.create({ username: 'Jane' }, { transaction: t });await t.commit(); // 提交事务
} catch (error) {await t.rollback(); // 回滚事务
}

生命周期钩子(Hooks)

User.beforeCreate((user, options) => {console.log('Before creating user:', user.username);
});

原生查询

如果需要执行原生 SQL,可以使用 sequelize.query。

const [results, metadata] = await sequelize.query('SELECT * FROM users');

具体项目案例

现在要实现一个用户认证模块,以node为后端,数据库是确定的,但是不在数据库当中建任何表,全依靠Sequelize进行:

src/config/db.js(后端数据库连接)

const { Sequelize } = require('sequelize')// 使用 Sequelize 连接 MySQL
// 这里配置数据库名称、用户名、密码、主机和方言
const sequelize = new Sequelize('project', 'root', '123456', {host: 'localhost',dialect: 'mysql',
})/*** 连接数据库的异步函数* 尝试验证与数据库的连接,如果成功则打印确认消息* 如果连接失败,则打印错误消息并退出进程*/
const connectDB = async () => {try {await sequelize.authenticate()console.log('MySQL Connected')} catch (err) {console.error('Unable to connect to the database:', err.message)process.exit(1)}
}// 导出 sequelize 实例和 connectDB 函数供外部使用
module.exports = { sequelize, connectDB }

src/modules/User.js(用户模型-用户数据表定义建立)

const { Sequelize, DataTypes } = require('sequelize')
const bcrypt = require('bcrypt')
const { sequelize } = require('../config/db')// 定义 User 模型
const User = sequelize.define('User', {username: {type: DataTypes.STRING,allowNull: false,unique: true,},password: {type: DataTypes.STRING,allowNull: false,},
})// 在保存用户之前加密密码
User.beforeCreate(async (user) => {user.password = await bcrypt.hash(user.password, 10)
})module.exports = User

src/app.js(程序入口)

//dotenv 是一个用于 加载环境变量 的 Node.js 模块,它会从项目根目录的 .env 文件中读取环境变量,并将其添加到 process.env 对象中
//开发者就可以通过 process.env.变量名 来访问环境变量。
require('dotenv').config()
const express = require('express')
//---------------------数据库部分-------------------------------------------------------------------------------
const { connectDB, sequelize } = require('./config/db')
const app = express()// 初始化数据库连接
connectDB()// 同步数据库表结构,sequelize.sync 会同步模型与数据库表。alter: true 会根据模型的定义修改数据库表结构(谨慎使用于生产环境)。
sequelize.sync({ alter: true }).then(() => {console.log('数据库和表结构已经同步成功')
})
//---------------------------------------------------------------------------------------------------------------
//express.json() 是一个中间件,用于解析 JSON 格式的请求体。
app.use(express.json())//通过 process.env.PORT 读取 .env 文件中配置的端口号,如果未定义,则默认使用 5000
const PORT = process.env.PORT || 5000
app.listen(PORT, () => console.log(`Server running on port ${PORT}`))// app.use('/api/auth', authRoutes):当访问 /api/auth 路径时,将由 authRoutes 处理请求。
// 这是模块化路由的常见实现方式。
const authRoutes = require('./routes/authRoutes')app.use('/api/auth', authRoutes)

其他一些可能用得上的功能

支持原始 SQL 查询

const results = await sequelize.query('SELECT * FROM Users WHERE username = :username', {replacements: { username: 'JohnDoe' },type: QueryTypes.SELECT,
});

高级查询

条件查询

const users = await User.findAll({where: {username: {[Op.like]: 'J%',},},
});

分页与排序

const users = await User.findAll({ limit: 10, offset: 20, order: [['username', 'ASC']] });

还有数据迁移和数据库连接池此处就不讲了
此处提供:
官方文档: https://sequelize.org/
GitHub 仓库: https://github.com/sequelize/sequelize
Sequelize 是一个功能全面的 ORM 工具,它简化了数据库操作,支持多种数据库类型。通过模型定义、查询构建、事务管理和数据库迁移,开发者可以高效地处理复杂的数据管理需求。如果你的项目需要频繁的数据库操作或希望避免直接使用 SQL,Sequelize 是一个值得选择的解决方案。

相关文章:

基于 Node.js 的 ORM(对象关系映射)工具——Sequelize介绍与使用,并举案例分析

便捷性介绍 支持多种数据库,包括 PostgreSQL、MySQL、MariaDB、SQLite 和 Microsoft SQL Server。Sequelize 提供了丰富的功能,帮助开发者用 JavaScript(或 TypeScript)代码操作数据库,而无需直接书写 SQL 语句。 Se…...

python 插入排序(Insertion Sort)

插入排序(Insertion Sort) 插入排序是一种简单的排序算法。它的基本思想是:将数组分为已排序部分和未排序部分,然后逐个将未排序部分的元素插入到已排序部分的正确位置。插入排序类似于整理扑克牌的过程。 插入排序的步骤&#…...

电子应用设计方案81:智能AI冲奶瓶系统设计

智能 AI 冲奶瓶系统设计 一、引言 智能 AI 冲奶瓶系统旨在为父母或照顾者提供便捷、准确和卫生的冲奶服务,特别是在夜间或忙碌时,减轻负担并确保婴儿获得适宜的营养。 二、系统概述 1. 系统目标 - 精确调配奶粉和水的比例,满足不同年龄段婴…...

JAVA高并发总结

JAVA高并发编程总结 在现代应用中,高并发编程是非常重要的一部分,尤其是在分布式系统、微服务架构、实时数据处理等领域。Java 提供了丰富的并发工具和技术,帮助开发者在多线程和高并发的场景下提高应用的性能和稳定性。以下是 Java 高并发编…...

【AIGC】使用Java实现Azure语音服务批量转录功能:完整指南

文章目录 引言技术背景环境准备详细实现1. 基础架构设计2. 实现文件上传功能3. 提交转录任务crul4. 获取转录结果 使用示例结果示例最佳实践与注意事项总结 引言 在当今数字化时代,将音频内容转换为文本的需求越来越普遍。无论是会议记录、视频字幕生成&#xff0c…...

arcgis模版空库怎么用(一)

这里以某个项目的数据为例: 可以看到,属性表中全部只有列标题,无数据内容 可能有些人会认为空库是用来往里面加入信息的,其实不是,正确的用法如下: 一、下图是我演示用的数据,我们可以看到其中…...

【电机控制】基于STC8H1K28的六步换向——方波驱动(软件篇)

【电机控制】基于STC8H1K28的六步换向——方波驱动(软件篇) 文章目录 [TOC](文章目录) 前言一、main.c二、GPIO.c三、PWMA.c四、ADC.c五、CMP.c六、Timer.c七、PMSM.c八、参考资料总结 前言 【电机控制】STC8H无感方波驱动—反电动势过零检测六步换向法 …...

小程序配置文件 —— 13 全局配置 - window配置

全局配置 - window配置 这里讲解根目录 app.json 中的 window 字段,window 字段用于设置小程序的状态栏、导航条、标题、窗口背景色; 状态栏:顶部位置,有网络信号、时间信息、电池信息等;导航条:有一个当…...

全球域名市场科普之域名交易平台介绍——Sedo与Afternic

关于Dynadot Dynadot是通过ICANN认证的域名注册商,自2002年成立以来,服务于全球108个国家和地区的客户,为数以万计的客户提供简洁,优惠,安全的域名注册以及管理服务。 Dynadot平台操作教程索引(包括域名邮…...

leetcode108:将有序数组转化为二叉搜索树

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。 示例 1: 输入:nums [-10,-3,0,5,9] 输出:[0,-3,9,-10,null,5] 解释:[0,-10,5,null,-3,null,9] 也将被视为正确…...

截图技术方案

安卓截屏技术附带悬浮窗自动存储功能_安卓截图浮窗-CSDN博客 https://chat.baidu.com/search?dyTabStrMCwxMiwzLDEsMiwxMyw3LDYsNSw5&pdcsaitab&setypecsaitab&extParamsJson%7B%22apagelid%22%3A%2210990774271994514433%22%2C%22enter_type%22%3A%22a_ai_index%…...

程序员测试日常小工具

作为一名程序员,或者测试人员,日常工作最常用的工具有哪些,截图,截图漂浮,翻译,日期处理,api调用..., 当你拿到一串报文后,想要json转换时,是不是要打…...

Kubernetes: NetworkPolicy 的实践应用

一、Network Policy 是什么,在云原生领域有和作用 Network Policy 是 Kubernetes 官方提出来的一种网络策略的规范,用户通过编写符合对应规范的规则来控制 k8s 集群内 L3 和 L4 层的网络流量。 NetworkPolicy 主要的功能就是实现在云原生领域的容器网络管控它给用…...

HTML5滑块(Slider)

HTML5 的滑块&#xff08;Slider&#xff09;控件允许用户通过拖动滑块来选择数值。以下是如何实现一个简单的滑块组件的详细说明。 HTML5 滑块组件 1. 基本结构 使用 <input type"range"> 元素可以创建一个滑块。下面是基本实现的代码示例&#xff1a; <…...

数据结构与算法之动态规划: LeetCode 72. 编辑距离 (Ts版)

编辑距离 https://leetcode.cn/problems/edit-distance/description/ 描述 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符删除一个字符替换一个字符 示例 1 输入&…...

洪水灾害多智能体分布式模拟示例代码

1. 环境定义&#xff1a;支持灾害动态、地理数据和分布式架构 import numpy as np import random import matplotlib.pyplot as plt# 新疆主要城市及邻接关系 XINJIANG_CITIES {Urumqi: [Changji, Shihezi],Changji: [Urumqi, Shihezi, Turpan],Shihezi: [Urumqi, Changji, K…...

【前端】Node.js使用教程

目录 一、?Node.js开发环境和编译 1.1 安装Node.js 1.2 创建一个Node.js项目 1.3 编写Node.js程序 1.4 运行Node.js程序 1.5 使用Node.js模块 二、高级的Node.js编程概念和示例 2.1 异步编程 2.2 错误处理 2.3 网络请求 2.4 构建Web服务器 2.5 数据库交互 三、No…...

django33全栈班2025年004 录入数据

前言 通过前面的学习, 我们已经算是Python基本入门了. 如果你能熟练的掌握的话, 至少让你换台电脑, 在新电脑上搭建Python的开发环境肯定是没问题的. 我们呢也学习了第一行Python代码, 但是我们不知道这行代码是什么意思, 为什么能够运行, 怎么就能输出到控制台呢? 还有, …...

小白投资理财 - 看懂 EPS 每股收益

小白投资理财 - 看懂 EPS 每股收益 什么是 EPSEPS 缺陷EPS 优点EPS 跟自己比EPS 跟别人比 总结 投资一家公司就要选择会赚钱的公司&#xff0c;我们最为关心的莫过于公司的盈利能力&#xff0c;只有会下蛋的鸡才是好鸡&#xff0c;买股票为的就是获得利润。想成为一位成功的投资…...

Pandas-apply自定义函数

文章目录 一. Series的apply方法1. 一个元素一个元素的传入2. apply传入一个参数函数2.apply传入多个参数函数 二. DataFrame的apply方法1. axis参数指定按行/ 按列(默认)传入数据2. apply使用 三. apply 使用案例1. 栗子12. 栗子2-列3. 栗子3-行 四. 向量化函数1. 使用np.vect…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...