Node == Sequelize 使用文档

目录

1. 简介

2. 安装

3. 连接到数据库

4. 测试连接

5. 关闭连接

6. 模型(Model)

define.sync({ force: true });

belongsTo

paranoid

7. 增删改查(CRUD)

7.1 查询(Query)

7.2 插入(Create)

7.3 更新(Update)

7.4 删除(Delete)

7.5 软删除 (restore) 

7.6 分页 (findAndCountAll)

7.7 查找单条(findOne) 

7.8 主键查询 (findByPk)

8. 实例方法

increment

reload

save

Sequelize 的 Op 对象

opt.and

opt.in


1. 简介

Sequelize 是一个基于 promise 的 Node.js ORM(对象关系映射器),支持多种数据库,包括 Postgres、MySQL、MariaDB、SQLite 以及 Microsoft SQL Server。它提供了强大的事务支持、关联关系、预读和延迟加载、读取复制等功能。

2. 安装

Sequelize 的使用可以通过 npm (或 yarn).

npm install --save sequelize

你还必须手动为所选数据库安装驱动程序:

3. 连接到数据库

要连接到数据库,需要创建一个 Sequelize 实例。这可以通过传递连接参数到 Sequelize 构造函数,或通过传递一个连接 URI 来完成:

const { Sequelize } = require('sequelize');// 方法 1: 传递一个连接 URI
const sequelize = new Sequelize('sqlite::memory:'); // Sqlite 示例
const sequelize = new Sequelize('postgres://user:pass@example.com:5432/dbname'); // Postgres 示例// 方法 2: 分别传递参数
const { Sequelize } = require("sequelize");
const {MYSQL_HOST,MYSQL_PORT,MYSQL_USER,MYSQL_PWD,MYSQL_DB,
} = require("../config/config.default");// 创建数据库实例(数据库名, 用户名, 密码, 配置)
const seq = new Sequelize(MYSQL_DB, MYSQL_USER, MYSQL_PWD, {host: MYSQL_HOST, // 数据库地址dialect: "mysql", // 数据库类型
});

Sequelize 构造函数接受许多参数,具体可以查看 API 参考。

4. 测试连接

使用 .authenticate() 方法测试连接是否成功:

// 测试数据库连接;
seq.authenticate().then(() => {console.log(MYSQL_DB, MYSQL_USER, MYSQL_PWD, MYSQL_HOST, "数据库连接成功");}).catch((err) => {console.log("数据库连接失败", err);});

5. 关闭连接

默认情况下,Sequelize 会保持连接打开状态。如果需要关闭连接,可以调用 sequelize.close() 方法。注意,一旦调用 sequelize.close(),就无法再打开新的连接,需要创建一个新的 Sequelize 实例来重新访问数据库。

6. 模型(Model)

模型是 Sequelize 中的一个核心概念,它定义了数据库中的表结构。以下是如何定义一个模型的示例:

define.sync({ force: true });

在 Sequelize 中,.define 方法用于定义模型,而 .sync 方法用于将模型同步到数据库。.sync({ force: true }).sync 方法的一个选项,它的作用是强制同步模型到数据库。这意味着如果数据库中已经存在同名的表,Sequelize 将会删除该表,并根据模型的定义重新创建。这会导致表中所有数据的丢失,因此这个操作是非常危险的,通常只在开发环境中使用,或者在完全了解可能的后果时使用。

belongsTo

belongsTo 是 Sequelize 中定义模型关联关系的一个方法,用于表示一个模型属于另一个模型。例如,如果一个博客文章(Post)属于一个用户(User),则可以使用 belongsTo 在 Post 模型中定义这种关系。这样,每个 Post 实例都会与一个 User 实例相关联,并且可以通过这个关系访问 User 的信息。

在 Sequelize 中,使用 belongsTo 时,会自动在关联的模型中创建一个外键,这个外键指向被关联模型的主键。例如,如果 Post 模型 belongsTo User 模型,Sequelize 会在 Post 表中创建一个 userId 字段,这个字段是 User 表的主键的外键。

  async getCartList(pageNum, pageSize) {// 分页const { count, rows } = await Cart.findAndCountAll({attributes: ["id", "number", "selected"], // 只返回这些字段offset: (pageNum - 1) * pageSize, // 偏移量limit: pageSize * 1, // 每页数量include: {model: Goods, // 关联 Goods 模型attributes: ["id", "goods_name", "goods_price", "goods_img"], // 只返回这些字段as: "goods_info", // 别名}, // 关联查询 关联 商品 模型});return {pageNum,pageSize,total: count,list: rows,};}

paranoid

paranoid 是 Sequelize 提供的一个特性,用于实现软删除。当一个模型被定义为 paranoid 时,调用 destroy 方法并不会真正从数据库中删除记录,而是在记录上设置一个 deletedAt 时间戳字段,标记这条记录为“已删除”。这样,除非特别指定,否则后续的查询都会自动忽略这些被标记为删除的记录。

要启用 paranoid 特性,需要在模型定义时传递 paranoid: true 选项。如果需要,还可以自定义 deletedAt 字段的名称。当需要执行硬删除时,可以通过传递 force: true 选项来覆盖 paranoid 特性,直接从数据库中删除记录。

//  cart 购物车表里有商品id 关联 goods 表 id
const { DataTypes } = require("sequelize");
const Goods = require("./goods.model.js");
const seq = require("../db/seq");
//  define; 定义模型
const Cart = seq.define("st_cart", {goods_id: {type: DataTypes.INTEGER, //INTEGER 整数类型allowNull: false, // allowNull 是否允许为空comment: "商品ID", // comment 注释},user_id: {type: DataTypes.INTEGER,allowNull: false,comment: "用户ID",},number: {type: DataTypes.INTEGER,allowNull: false,defaultValue: 1,comment: "商品数量",},selected: {type: DataTypes.BOOLEAN, // 布尔类型allowNull: false,defaultValue: true, // defaultValue 默认值comment: "是否选中",},
});// Cart.sync({ force: true });
/*** 关联关系*  Cart表中有一个goods_id字段*  这个goods_id引用了Goods表的id*  每个购物车项只能对应一个商品(belongsTo)* 外键的作用*  数据完整性:确保购物车中的商品一定存在于商品表中*  关联查询:可以方便地查询商品的详细信息*/
// 关联 Goods 模型 使用 belongsTo 方法 关联外键 goods_id 并设置别名 goods_info
Cart.belongsTo(Goods, { foreignKey: "goods_id", as: "goods_info" }); // 因为goods_id 是外键,所以需要使用 belongsTo 关联 Goods 模型
module.exports = Cart;

7. 增删改查(CRUD)

7.1 查询(Query)

使用模型的 .findAll() 方法进行查询: 

  • attributes 指定返回的字段
  • where 查询条件
  async getAddrList(user_id) {return await Address.findAll({attributes: ["id", "consignee", "phone", "address", "is_default"], // 指定返回的字段where: { user_id },});}

7.2 插入(Create)

使用模型的 .create() 方法插入数据:、

User.create({username: 'newuser',email: 'newuser@example.com'
}).then(user => {console.log(user);
});

7.3 更新(Update)

使用模型的 .update() 方法更新数据:

User.update({username: 'updateduser'
}, {where: {id: 1}
}).then(result => {console.log(result);
});

7.4 删除(Delete)

使用模型的 .destroy() 方法删除数据:

force: true, // 添加 force: true 实现硬删除

  async removeGoods(id) {const res = await Goods.destroy({where: { id },force: true, // 添加 force: true 实现硬删除});console.log(res);return res > 0 ? true : false;}

7.5 软删除 (restore) 

在 Sequelize 中,restore 方法用于恢复被软删除的记录。当模型启用了 paranoid 模式后,记录在被 destroy 方法调用时并不会真正从数据库中删除,而是标记为已删除。使用 restore 方法可以将这些被标记为已删除的记录恢复到可查询的状态。

// 假设有一个启用了 paranoid 的模型实例 instance
instance.restore().then(() => {// 记录已恢复}).catch(error => {// 处理错误});

7.6 分页 (findAndCountAll

findAndCountAll 方法用于执行查询并返回两个值:匹配查询条件的记录集合和这些记录的总数。这对于分页显示结果非常有用。

 async getGoodsList(pageNum, pageSize) {// offset 偏移量 (当前页码-1)* 每页条数 = 跳过多少条数据const offset = (pageNum - 1) * pageSize;// 获取商品总数 (全局开启 paranoid: true 软删除之后count会自动过滤掉)// const count = await Goods.count();// 获取商品列表// const rows = await Goods.findAll({//   offset, // 跳过条数//   limit: Number(pageSize), // 获取条数// });// 获取商品总数和商品列表 可以减少数据库查询次数const { count, rows } = await Goods.findAndCountAll({offset, // 跳过条数limit: Number(pageSize), // 获取条数});return {pageNum,pageSize,total: count,list: rows,};}

7.7 查找单条(findOne) 

findOne 方法用于查找符合特定条件的第一个记录。如果找到了符合条件的记录,它将返回一个模型实例;如果没有找到,将返回 null

Model.findOne({where: {// 查询条件}
})
.then(instance => {if (instance) {// 找到了符合条件的记录} else {// 没有找到符合条件的记录}
})
.catch(error => {// 处理错误
});

7.8 主键查询 (findByPk

findByPk(Find By Primary Key)是 Sequelize 提供的一个方法,用于根据主键值查找记录。这个方法非常适合当你知道要查询记录的具体主键值时使用。它直接查询数据库,返回与给定主键值相匹配的单个记录。

// 假设有一个模型实例 Model 和一个主键值 pk
Model.findByPk(pk).then(instance => {if (instance) {// 找到了主键值匹配的记录console.log(instance);} else {// 没有找到匹配的记录console.log('No instance found');}}).catch(error => {// 处理错误console.error(error);});

8. 实例方法

在 Sequelize 中,incrementreloadsave 是实例方法,它们可以在模型的单个实例上调用,用于执行特定的数据库操作。下面是这些方法的详细说明和使用示例:

increment

increment 方法用于将实例的某个字段的值增加一个指定的数值。这个方法不会影响其他字段,并且会自动处理字段值的数据类型转换。如果字段值是整数,那么增加的数值可以是任何整数;如果字段值是浮点数,那么增加的数值可以是小数。

// 假设有一个 User 模型实例 user
user.increment('age', { by: 1 }) // 将 age 字段增加 1.then(() => {// 增加操作成功,user 对象的 age 属性已经更新console.log(user.age); // 输出更新后的 age 值}).catch(error => {// 处理错误console.error(error);});

increment 方法接受两个参数:第一个是要增加的字段名,第二个是一个选项对象,其中 by 属性指定了要增加的数值。

reload

reload 方法用于重新从数据库中加载实例的数据。这在你更新了数据库中的记录,但希望在不重新查询数据库的情况下更新 Sequelize 实例的状态时非常有用。

// 假设有一个 User 模型实例 user
user.reload().then(() => {// 实例已重新加载,user 对象的数据现在是最新的console.log(user.get()); // 输出重新加载后的用户数据}).catch(error => {// 处理错误console.error(error);});

save

save 方法用于将实例的当前状态保存到数据库。如果实例是新的(即还没有被创建),save 方法会执行一个 INSERT 操作;如果实例已经存在(即主键字段有值),save 方法会执行一个 UPDATE 操作。

 

javascript

// 假设有一个 User 模型实例 user
user.save().then(() => {// 实例已保存到数据库console.log('User saved successfully');}).catch(error => {// 处理错误console.error(error);});

save 方法会检查实例的更改,并且只更新那些被修改过的字段。如果实例没有任何更改,save 方法将不会执行任何数据库操作。
 

Sequelize 的 Op 对象

Sequelize 的 Op 对象提供了一组用于构建复杂查询条件的操作符。这些操作符可以帮助开发者在查询数据库时更加灵活和高效地使用多个条件进行筛选。

opt.and

opt.and 是一个操作符,用于在查询中组合多个条件,只有当所有条件都满足时才返回结果。它通常与一个数组一起使用,数组中的每个元素都是一个条件对象。这意味着,只有当所有条件都为真时,查询才会返回结果。

const { Op } = require('sequelize');Model.findAll({where: {[Op.and]: [{ age: { [Op.gt]: 18 } }, // 年龄大于18{ gender: 'male' } // 性别为男性]}
});

在上面的代码中,我们使用了 Op.and 来组合两个条件:年龄大于18岁和性别为男性。只有同时满足这两个条件的记录才会被查询出来。

opt.in

opt.in 是一个操作符,用于查询符合指定数组中任意值的结果。在 where 条件对象中指定相关的属性及具体查询的值,例如:

const { Op } = require('sequelize');Model.findAll({where: {id: {[Op.in]: [1, 2, 3] // id 为 1、2 或 3}}
});

上面的操作会查询 Model 表中所有 id 值为 1、2、3 的结果集。opt.in 非常适合用于检查某个字段的值是否在给定的数组中。

通过使用 Op 对象中的 andin 操作符,Sequelize 使得构建复杂查询变得更加简单和直观。这些操作符在实际开发中非常有用,尤其是在需要根据多个条件进行数据筛选时。

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

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

相关文章

物联网智能技术的深入探讨与案例分析

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

Keil基于ARM Compiler 5的工程迁移为ARM Compiler 6的工程

环境: keil版本为5.38,版本务必高于5.30 STM32F4的pack包版本要高于2.9 软件包下载地址:https://zhuanlan.zhihu.com/p/262507061 一、更改Keil中编译器 更改后编译,会报很多错,先不管。 二、更改头文件依赖 观察…

9.《滑动窗口篇》---①长度最小的子数组(中等)

滑动窗口推导过程 我们不能说一上来就知道这个题目用滑动窗口,然后就使用滑动窗口的方法来做这个题目。 首先我们想到的应该是暴力解法。 接着再优化为滑动窗口 由于数字都是 ≥ 0 的数。因此累加的数越多。和越大。 因此right往后遍历的时候。当发现sum > targe…

Marin说PCB之电源完整性之电源网络的PDN仿真CST---04

小编我最近都要忙疯了,好不容易去韩国出个差,打算不忙的时候去首尔看看韩国的美女们,说错了,是看美景啊。谁料想韩国分公司的SI同事的李相赫同志由于结婚请假了一个多月啊,他倒是挺爽啊,和老婆去度蜜月了&a…

视频融合×室内定位×数字孪生

随着物联网技术的迅猛发展,室内定位与视频融合技术在各行各业中得到了广泛应用。不仅能够提供精确的位置信息,还能通过实时视频监控实现全方位数据的可视化。 与此同时,数字孪生等技术的兴起为智慧城市、智慧工厂等应用提供了强大支持&#…

git push时报错! [rejected] master -> master (fetch first)error: ...

错误描述:在我向远程仓库push代码时,即执行 git push origin master命令时发生的错误。直接上错误截图。 错误截图 错误原因: 在网上查了许多资料,是因为Git仓库中已经有一部分代码,它不允许你直接把你的代码覆盖上去…

概念解读|K8s/容器云/裸金属/云原生...这些都有什么区别?

随着容器技术的日渐成熟,不少企业用户都对应用系统开展了容器化改造。而在容器基础架构层面,很多运维人员都更熟悉虚拟化环境,对“容器圈”的各种概念容易混淆:容器就是 Kubernetes 吗?容器云又是什么?容器…

【Android】线程池的解析

引言 在Android当中根据用途分为主线程与子线程,主线程当中主要处理与界面相关的操作,子线程主要进行耗时操作。除了Thread本身以外,在Android当中还有很多扮演者线程的角色,比如AsyncTask( 底层为线程池,…

本地音乐服务器(三)

6. 删除音乐模块设计 6.1 删除单个音乐 1. 请求响应设计 2. 开始实现 首先在musicmapper新增操作 Music findMusicById(int id);int deleteMusicById(int musicId); 其次新增相对应的.xml代码&#xff1a; <select id"findMusicById" resultType"com.exa…

Spring Boot图书馆管理系统:疫情中的管理利器

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了疫情下图书馆管理系统的开发全过程。通过分析疫情下图书馆管理系统管理的不足&#xff0c;创建了一个计算机管理疫情下图书馆管理系统的方案。文章介绍了疫情下图…

集群聊天服务器(7)数据模块

目录 Mysql数据库代码封装头文件与源文件 Mysql数据库代码封装 业务层代码不要直接写数据库&#xff0c;因为业务层和数据层的代码逻辑也想完全区分开。万一不想存储mysql&#xff0c;想存redis的话&#xff0c;就要改动大量业务代码。解耦合就是改起来很方便。 首先需要安装m…

Linux第93步_Linux内核的LED灯驱动

Linux内核的LED灯驱动采用platfomm框架&#xff0c;因此我们只需要按照要求在“设备树文件”中添加相应的LED节点即可。 1 、通过“linux内核图形化配置界面”令“CONFIG_LEDS_GPIOy” 1)、打开终端&#xff0c;输入“cd linux/atk-mp1/linux/my_linux/linux-5.4.31/回车”&a…

Zmap+python脚本+burp实现自动化Fuzzing测试

声明 学习视频来自 B 站UP主泷羽sec&#xff0c;如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识&#xff0c;以下网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0c;否则后果自负。 ✍&#x1f3fb;作者简介&#xff1a;致…

红外相机和RGB相机外参标定 - 无需标定板方案

1. 动机 在之前的文章中红外相机和RGB相机标定&#xff1a;实现两种模态数据融合_红外相机标定-CSDN博客 &#xff0c;介绍了如何利用标定板实现外参标定&#xff1b;但实测下来发现2个问题&#xff1a; &#xff08;1&#xff09;红外标定板尺寸问题&#xff0c;由于标定板小…

android:taskAffinity 对Activity退出时跳转的影响

android:taskAffinity 对Activity跳转的影响 概述taskAffinity 的工作机制taskAffinity对 Activity 跳转的影响一个实际的开发问题总结参考 概述 在 Android 开发中&#xff0c;任务栈&#xff08;Task&#xff09;是一个核心概念。它决定了应用程序的 Activity 如何相互交互以…

Ubuntu常见命令

关于export LD_LIBRARY_PATHcmake默认地址CMakelists.txt知识扩充/home&#xff1a;挂载新磁盘到 /home 子目录 关于export LD_LIBRARY_PATH 程序运行时默认的依赖库的位置包括lib, /usr/lib ,/usr/local/lib 通过命令export LD_LIBRARY_PATHdesired_path:$LD_LIBRARY_PATH追加…

时间类的实现

在现实生活中&#xff0c;我们常常需要计算某一天的前/后xx天是哪一天&#xff0c;算起来十分麻烦&#xff0c;为此我们不妨写一个程序&#xff0c;来减少我们的思考时间。 1.基本实现过程 为了实现时间类&#xff0c;我们需要将代码写在3个文件中&#xff0c;以增强可读性&a…

php交友源码交友系统源码相亲交友系统源码php社交系统php婚恋源码php社区交友源码vue 仿交友社交语聊技术栈

关于PHP交友、相亲、婚恋、社区交友系统的源码以及Vue仿交友社交语聊技术栈&#xff0c;以下是一些详细信息和建议&#xff1a; 一、PHP交友系统源码 系统架构设计 前端展示层&#xff1a;负责向用户提供直观友好的界面&#xff0c;包括注册登录页面、个人资料页面、匹配页面、…

Java小技艺

使用bat文件启动jar包 平时在工作中运行jar包一般是导出后命令行窗口运行 jar -jar xxx.jar 这个其实是很不方便的。可以在win上编写bat脚本去运行jar包的。 1 编写bat脚本 start jre8/bin/javaw -jar xxxx.jar2 将jre和待执行的jar包存放到一个目录下(和bat文件在同一目录…

蓝桥杯第22场小白入门赛2~5题

这场比赛开打第二题就理解错意思了&#xff0c;还以为只能用3个消除和5个消除其中一种呢&#xff0c;结果就是死活a不过去&#xff0c;第三题根本读不懂题意&#xff0c;这蓝桥杯的题面我只能说出的是一言难尽啊。。第四题写出来一点但是后来知道是错了&#xff0c;不会正解&am…