基于 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' },
});

Sequelize 模型内置的方法总结(常用的)

findAll():查询所有记录(生成 SELECT 查询)。
findByPk():根据主键查询单个记录(生成 SELECT 查询)。
create():创建新记录(生成 INSERT 查询)。
save():保存(更新)模型实例(生成 UPDATE 或 INSERT 查询)。
destroy():删除模型实例对应的记录(生成 DELETE 查询)。
update():更新多条记录(生成 UPDATE 查询)。
count():查询记录的总数(生成 SELECT COUNT 查询)。
这些方法使得你可以用对象化的方式来进行数据库操作,而不需要手动编写 SQL 语句,从而提高了开发效率并减少了错误。

其他基本数据库操作

关联(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 是一个值得选择的解决方案。

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

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

相关文章

美的空气净化器好用吗?拾梧、美的、戴森空气净化器除烟哪个好?

说到二手烟,这可真是个让人头疼的问题!它里面含有超过7000种化学物质,形式多样,处理起来比甲醛这些传统污染物难多了。在市场上那么多空气净化器里,要挑一个能真正对付二手烟的,简直就像大海捞针一样难。不…

【机器学习】穷理至极,观微知著:微积分的哲思之旅与算法之道

文章目录 微积分基础:理解变化与累积的数学前言一、多重积分的高级应用1.1 高维概率分布的期望值计算1.1.1 多维期望值的定义1.1.2 Python代码实现1.1.3 运行结果1.1.4 结果解读 1.2 特征空间的体积计算1.2.1 单位球体的体积计算1.2.2 Python代码实现1.2.3 运行结果…

Ae:合成设置 - 3D 渲染器

Ae菜单:合成/合成设置 Composition/Composition Settings 快捷键:Ctrl K After Effects “合成设置”对话框中的3D 渲染器 3D Renderer选项卡用于选择和配置合成的 3D 渲染器类型,所选渲染器决定了合成中的 3D 图层可以使用的功能&#xff0…

Zookeeper是如何解决脑裂问题的?

大家好,我是锋哥。今天分享关于【Zookeeper是如何解决脑裂问题的?】面试题。希望对大家有帮助; Zookeeper是如何解决脑裂问题的? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Zookeeper 通过一系列的机制来防止和解决脑裂(sp…

【python因果库实战15】因果生存分析4

这里写目录标题 加权标准化生存分析总结个体层面的生存曲线 加权标准化生存分析 我们还可以将加权与标准化结合起来,使用 WeightedStandardizedSurvival 模块。在这里,我们将逆倾向得分加权模型(根据基线协变量重新加权人群)与加…

windows中硬件加速gpu计划开启cpu的使用率居高不下

1.加速gpu计划开启在任务管理器的gpu选项中看不到cuda选项,这给我们进行深度学习训练和推理带来很大影响。 2.开启硬件加速CPU的占用率明显增高,特别用GPU进行实时视频流解码时就不会分配给GPU解码,造成cpu占用居高不下。不利于深度学习训练…

OpenGL入门最后一章观察矩阵(照相机)

前面的一篇文章笔者向大家介绍了模型变化矩阵,投影矩阵。现在只剩下最后一个观察矩阵没有和大家讲了。此片文章就为大家介绍OpenGL入门篇的最后一个内容。 观察矩阵 前面的篇章当中,我们看到了即使没有观察矩阵,我们也能对绘制出来的模型有一…

java.lang.Error: FFmpegKit failed to start on brand:

如果你使用FFmpegKit的时候遇到了这个问题: java.lang.Error: FFmpegKit failed to start on brand: Xiaomi, model: MI 8, device: dipper, api level: 29, abis: arm64-v8a armeabi-v7a armeabi, 32bit abis: armeabi-v7a armeabi, 64bit abis: arm64-v8a.at c…

KAGGLE竞赛实战2-捷信金融违约预测竞赛-part1-数据探索及baseline建立

竞赛链接:https://www.kaggle.com/competitions/home-credit-default-risk/ 认识数据集:application的两张表是申请人信息 通过id关联bureau:过去的借款、previous_application两张表 而bureau_balance则代表对应的还款信息 表之间的关系…

【软考网工笔记】计算机基础理论与安全——网络安全

病毒 Melissa 宏病毒 1. 是一种快速传播的能够感染那些使用MS Word 97 和MS Office 2000 的计算机宏病毒。 2. 前面有**Macro** 表示这是宏病毒; 3. 宏病毒可以感染后缀为.xls的文件;Worm 蠕虫病毒 1. 通常是通过网络或者系统漏洞进行传播。 2. 利用信…

Java虚拟机(Java Virtual Machine,JVM)

一、Java 虚拟机 Java 虚拟机(Java Virtual Machine, JVM)是运行 Java 字节码的虚拟机。它是Java平台的核心组件之一,使得Java程序具有 一次编写,到处运行(Write Once, Run Anywhere) 的特性。 JVM 有针对…

ChatGPT 主流模型GPT-4/GPT-4o mini的参数规模是多大?

微软论文又把 OpenAI 的机密泄露了??在论文中明晃晃写着: o1-preview 约 300B;o1-mini 约 100BGPT-4o 约 200B;GPT-4o-mini 约 8BClaude 3.5 Sonnet 2024-10-22 版本约 175B微软自己的 Phi-3-7B,这个不用约…

GESP202406 二级【计数】题解(AC)

》》》点我查看「视频」详解》》》 [GESP202406 二级] 计数 题目描述 小杨认为自己的幸运数是正整数 k k k(注:保证 1 ≤ k ≤ 9 1 \le k\le 9 1≤k≤9)。小杨想知道,对于从 1 1 1 到 n n n 的所有正整数中, k…

SpringMVC(六)拦截器

目录 1.什么是拦截器 2.拦截器和过滤器有哪些区别 3.拦截器方法 4.单个拦截器的执行流程 5.使用拦截器实现用户登录权限验证(实例) 1.先在html目录下写一个login.html文件 2.在controller包下写一个LoginController文件 3.加拦截器 1.创建一个conf…

基于Arduino的FPV头部追踪相机系统

构建FPV头部追踪相机:让你置身于遥控车辆之中! 在遥控车辆和模型飞行器的世界中,第一人称视角(FPV)体验一直是爱好者们追求的目标。通过FPV头部追踪相机,你可以像坐在车辆或飞行器内部一样,自由…

jQuery get 方法内操控vue变量(异步ajax请求方法中操控双向绑定的响应式变量)实现异步请求函数内完成变量的双向响应式绑定

// 首先,创建一个Vue实例 new Vue({ el: #app, data: { message: Hello, Vue! }, mounted: function() { var self this; // 使用jQuery发起get请求 $.get(your/api/url, function(data) { // 当请求成功完成后,更新Vue实…

Spring boot接入xxl-job

Spring boot接入xxl-job 导入maven包加入配置增加配置类创建执行器类&#xff08;写job的业务逻辑&#xff09;去控制台中配置job 导入maven包 <dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>…

【超详细】React SSR 服务端渲染实战

前言 这篇文章和大家一起来聊一聊 React SSR&#xff0c;本文更偏向于实战。你可以从中学到&#xff1a; 从 0 到 1 搭建 React SSR 服务端渲染需要注意什么 react 18 的流式渲染如何使用 文章如有误&#xff0c;欢迎指出&#xff0c;大家一起学习交流&#xff5e;。 &…

25年对AI产业的25点预测以及展望思考

| 2025 大宝同学对于AI 产业 25点预测&#xff0c;他自嘲道&#xff1a;“做不做 250 不重要&#xff0c;重要的是不违背自己的良知&#xff0c;以及对自身物种的坚信。”&#x1f600;ps&#xff1a;因大宝的这篇文章基文涉猎太过于广泛&#xff0c;考虑到某些原因&#xff0c…

Qt之屏幕录制设计(十六)

Qt开发 系列文章 - screencap&#xff08;十六&#xff09; 目录 前言 一、实现原理 二、实现方式 1.创建录屏窗口 2.录屏窗口类定义 3.自建容器对象定义 4.用户使用 5.效果演示 总结 前言 利用Qt实现屏幕录制设计&#xff0c;可以通过使用Qt自带的类QScreen、QPixma…