当前位置: 首页 > 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…...

AI超清画质增强镜像实测效果:智能降噪与细节补充,画质提升明显

AI超清画质增强镜像实测效果&#xff1a;智能降噪与细节补充&#xff0c;画质提升明显 1. 引言&#xff1a;当模糊照片遇见AI“脑补”技术 你有没有遇到过这样的烦恼&#xff1f;翻看老相册时&#xff0c;那些承载着珍贵回忆的照片却因为年代久远而变得模糊不清&#xff1b;从…...

DeepSeek-R1-Distill-Qwen-1.5B实战:3步完成模型部署,开启智能对话体验

DeepSeek-R1-Distill-Qwen-1.5B实战&#xff1a;3步完成模型部署&#xff0c;开启智能对话体验 1. 模型简介与核心优势 DeepSeek-R1-Distill-Qwen-1.5B是DeepSeek团队基于Qwen2.5-Math-1.5B基础模型&#xff0c;通过知识蒸馏技术融合R1架构优势打造的轻量化版本。这个1.5B参数…...

RMBG-2.0在数字人项目中的应用:实时抠像→驱动虚拟形象→直播推流

RMBG-2.0在数字人项目中的应用&#xff1a;实时抠像→驱动虚拟形象→直播推流 1. 项目背景与核心价值 想象一下&#xff0c;你正在准备一场线上直播&#xff0c;但背景杂乱&#xff0c;或者你希望以一个虚拟形象出现在观众面前。传统的绿幕抠像方案不仅需要专门的物理空间和灯…...

ALIGN vs CLIP:哪个更适合你的多模态项目?详细对比与选型指南

ALIGN vs CLIP&#xff1a;多模态模型选型实战指南 当你在构建一个需要同时理解图像和文本的AI系统时&#xff0c;ALIGN和CLIP这两个名字一定会频繁出现。作为2023年最炙手可热的多模态模型&#xff0c;它们都能将视觉和语言映射到同一个语义空间&#xff0c;但设计哲学和适用场…...

OpenClaw健康助手:Qwen3-4B-Thinking-2507-GPT-5-Codex-Distill-GGUF分析运动手环数据

OpenClaw健康助手&#xff1a;Qwen3-4B-Thinking-2507-GPT-5-Codex-Distill-GGUF分析运动手环数据 1. 为什么需要个人健康数据助手 去年体检报告上的几项异常指标让我意识到&#xff0c;单纯依赖年度体检远远不够。虽然我的小米手环7每天记录着睡眠、心率和运动数据&#xff…...

Go语言的Context上下文管理

Go语言的Context上下文管理 Context的概念 Context&#xff08;上下文&#xff09;是Go语言中一个非常重要的包&#xff0c;它提供了一种在goroutine之间传递请求范围的值、取消信号和截止时间的方法。Context在处理HTTP请求、数据库操作、RPC调用等场景中非常有用。 Context的…...

Speakeasy与Google Authenticator深度集成:QR码生成与扫描全流程

Speakeasy与Google Authenticator深度集成&#xff1a;QR码生成与扫描全流程 【免费下载链接】speakeasy **NOT MAINTAINED** Two-factor authentication for Node.js. One-time passcode generator (HOTP/TOTP) with support for Google Authenticator. 项目地址: https://g…...

我郑重声明:我的目标是图灵奖,这是理工男的执念!所以在第一时间发现可实现AGI蓝图的时候,就给图灵奖官方邮箱发了论文PDF,这是存档+时间戳。我知道,明确知道,最终的AGI实现必然走我的路子。哈哈哈

总有人拿民科来说事&#xff0c;仔细想咱真也是民科&#xff0c;&#xff0c;&#xff0c;没啥说的&#xff0c;没混上教授的&#xff0c;那个不是民科&#xff1f;&#xff1f;&#xff1f; 不要拿民科怎么样来说事&#xff0c;我开始没说自己咋样&#xff0c;真就只想那个图…...

seo网站推广与社交媒体营销的结合_seo网站推广的投资回报率如何计算

SEO网站推广与社交媒体营销的结合&#xff1a;如何计算SEO网站推广的投资回报率 在当今的数字营销时代&#xff0c;SEO网站推广和社交媒体营销是两个不可或缺的组成部分。它们的结合可以帮助企业更好地吸引潜在客户&#xff0c;提高品牌知名度&#xff0c;并最终推动销售增长。…...

解释器指令入口——转发表

解释器指令入口——转发表 JVM虚拟机当执行到某个字节码指令时,并不是像想象中的采用下列C语言的形式执行 void Execute(ByteCode code){switch(code){case NOP:do_nop();break;case ACONST_NULL:do_aconst_null();break;...} }之所以hotspot不能用上述方法的原因是计算机的…...