使用 mysql2/promise 模块返回以后,使用 await 返回数据总结

SELECT 返回结构

const [rows, fields] = await db.query('SELECT * FROM folders');

返回:

  • rows: 是一个数组,包含所有查到的记录。
  • fields: 是字段的结构定义(列信息),一般不用。

rows 是一个数组,包含所有查到的记录:

[{ id: 1, name: '一级选项1', parent_id: null },{ id: 2, name: '子目录1', parent_id: 1 }
]

INSERT 返回结构

const [result] = await db.query('INSERT INTO folders (name, parent_id) VALUES (?, ?)', ['test', 1]);

result 是一个包含插入信息的对象:

{fieldCount: 0,      // 字段数(一般是 0,插入不返回字段)affectedRows: 1,    // 受影响的行数insertId: 17,       // 新插入的主键 IDserverStatus: 2,    // MySQL 服务器状态码warningCount: 0,    // 警告数量,0 表示无警告message: '',        // 服务器返回的信息,一般为空或插入成功消息protocol41: true,   // 与协议有关,true 表示使用 4.1 协议changedRows: 0      // 插入时恒为 0,仅在 UPDATE 时有意义
}

所以判断成功的办法是通过 affectedRows

if (result.affectedRows === 1) {return res.status(200).json({message: '目录添加成功',folderId: result.insertId});
} else {return res.status(500).json({ error: '添加目录失败' });
}

UPDATE 返回结构:

const [result] = await db.query('UPDATE folders SET name = ? WHERE id = ?', ['newName', 17]);

result 内容:

{fieldCount: 0,affectedRows: 1,   // 匹配并执行更新的行数(包括实际没变内容的)insertId: 0,        // 无插入则为 0serverStatus: 2,warningCount: 0,message: '(Rows matched: 1 Changed: 1 Warnings: 0)',protocol41: true,changedRows: 1     // 实际内容发生变化的行数
}

DELETE 返回结构:

const [result] = await db.query('DELETE FROM folders WHERE id = ?', [17]);

result 内容:

{fieldCount: 0,affectedRows: 1,   // 删除成功的行数insertId: 0,serverStatus: 2,warningCount: 0,message: '',       // 有时会包含删除说明protocol41: true,changedRows: 0     // 始终为 0,DELETE 不用这个字段
}

不能随便“模拟”结构解构,必须清楚它的真实结构是数组 [rows, fields],否则会出错。

❌ 错误示例:

const { affectedRows } = await db.query(...); // ❌ 报错,因为它不是对象,是数组

✅ 正确示例:

const [result] = await db.query(...); // result 是对象
console.log(result.affectedRows);     // 访问插入/更新结果

总结

场景返回值结构解构方式
SELECT[rows, fields][rows][rows, fields]
INSERT/UPDATE/DELETE[result, undefined][result]

由于

  • 新增 result.affectedRows === 1
  • 编辑 result.affectedRows > 0 更新语句执行了,result.changedRows > 0 内容确实有变更;
  • 删除 result.affectedRows > 0

新增

const [result] = await db.query('INSERT INTO folders (name) VALUES (?)', ['Test']);if (result.affectedRows === 1) {console.log('插入成功,ID:', result.insertId);
} else {console.log('插入失败');
}

编辑

const [result] = await db.query('UPDATE folders SET name = ? WHERE id = ?', ['NewName', 5]);if (result.affectedRows > 0) {console.log('更新语句执行了');if (result.changedRows > 0) {console.log('内容确实有变更');} else {console.log('字段值没变(例如改成原来的值)');}
} else {console.log('没有任何记录被更新');
}

删除

const [result] = await db.query('DELETE FROM folders WHERE id = ?', [999]);if (result.affectedRows > 0) {console.log('删除成功');
} else {console.log('未删除任何记录(可能 id 不存在)');
}

最实用的判断逻辑:

try {const [result] = await db.query(sql, values);if (result.affectedRows > 0) {// ✅ SQL 生效} else {// ⚠️ SQL 没生效(可能条件不匹配)}
} catch (err) {// ❌ SQL 执行失败(语法、连接、权限等错误)
}

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

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

相关文章

Manus Metagloves pro高精度+无漂移+低延迟 ,重构VR/XR手部交互方式

manus metagloves pro是一款专为动画制作、虚拟现实及游戏开发打造的高精度无线动作捕捉手套。采用先进的Quantum追踪技术,实现毫米级动作捕捉,精准还原手指细节,显著提升创作效率与交互真实感。 MANUS Metagloves Pro解锁动捕 / 机器人 / XR…

Uniapp插件改造指南:如何让vue-plugin支持HarmonyOS5原生能力?

一、分层架构设计 采用通用逻辑与平台实现分离的三层结构: uni-plugin-harmony ├── common # 跨平台通用层 │ ├── interfaces # 能力接口抽象(如Scanner.ets) │ └── utils # 工具类 ├── harmony …

P1040 [NOIP 2003 提高组] 加分二叉树 题解

题目描述 设一个 n n n 个节点的二叉树 tree \text{tree} tree 的中序遍历为 ( 1 , 2 , 3 , … , n ) (1,2,3,\ldots,n) (1,2,3,…,n),每个节点都有一个分数(均为正整数)。任一棵子树 subtree \text{subtree} subtree(包含 tr…

【Golang面试题】Data Race 问题怎么检测?

Go Race Detector 深度指南:原理、用法与实战技巧 一、什么是数据竞争? 在并发编程中,数据竞争发生在两个或多个 goroutine 同时访问同一内存位置,且至少有一个是写操作时。这种竞争会导致不可预测的行为和极其难以调试的问题。…

257. 二叉树的所有路径(js)

257. 二叉树的所有路径——DFS 回溯(js) 题目描述解题思路完整代码时间复杂度分析 题目描述 257. 二叉树的所有路径 解题思路 题意理解 给定一棵二叉树,要求返回所有从根节点到叶子节点的路径,路径以字符串形式表示&#xff0c…

自动化文档生成工具(亲测可运行)

本文介绍了一个用Java编写的自动化文档生成工具,通过读取开发清单文本自动生成格式规范的Word文档。该工具的主要特点包括: 采用Apache POI库处理Word文档,支持多级标题和段落自动生成实现中文数字转换功能,将编号转换为"一、…

湖北理元理律师事务所债务优化模型:法律与生活的平衡之道

在债务重组领域,专业机构需同时解决两个矛盾:法律合规性与债务人可持续生存能力。湖北理元理律师事务所通过“三维干预模型”,在武汉某餐饮连锁企业债务危机中验证了该方案的有效性。 一、法律底层设计:还款方案的合法性审查 以该…

Web3-代币ERC20/ERC721以及合约安全溢出和下溢的研究

Web3-代币ERC20/ERC721以及合约安全溢出和下溢的研究 以太坊上的代币 如果你对以太坊的世界有一些了解,你很可能听人们聊过代币— ERC20代币 一个 代币 在以太坊基本上就是一个遵循一些共同规则的智能合约——即它实现了所有其他代币合约共享的一组标准函数&…

论文笔记 <交通灯><多智能体>MetaLight:基于价值的元强化学习用于交通信号控制

今天看的论文是这篇MetaLight:基于价值的元强化学习用于交通信号控制 里面提到的创新点就是MetaLight框架:他目标是让交通信号控制智能体(Agent)在新路口(即使结构或流量模式不同)上能​​快速学习​​(Few…

华为OD-2024年E卷-寻找符合要求的最长子串[200分] -- python

问题描述: 给定一个字符串s,找出这样一个子串: 1)该子串中的任意一个字符最多出现2次; 2)该子串不包含指定某个字符; 请你找出满足该条件的最长子串的长度。 输入描述 第一行为要求不包含的指定字符,为单个字符,取值范围[0-9a-zA…

CppCon 2016 学习:What C++ Programmers Need to Know about Header <random>

随机数生成的历史背景 Middle-Square 方法(中位平方法): 已知最早的随机算法之一或由修道士 Brother Edvin 在 1245 年发明由 John von Neumann 在 1949 年重新发现缺点明显,但执行速度快 Monte Carlo 方法: 起初是…

Origin:误差棒点线图绘制

1.首先将你的数据复制到表格 2.选中B(y)列数据,依次点击图示选项 3.选中图中红框数据,点击绘制点线图即可 4.结果展示

Spring 源码学习 1:ApplicationContext

Spring 源码学习 1:ApplicationContext Bean 定义和 Bean 实例 AnnotationConfigApplicationContext 首先,创建一个最简单的 Spring Boot 应用。 在入口类中接收SpringApplication.run的返回值: SpringBootApplication public class Dem…

CppCon 2017 学习:Design Patterns for Low-Level Real-Time Rendering

这段内容讲的是离散显卡(Discrete GPU)中的内存管理模型,重点是CPU和GPU各自独立管理自己的物理内存,以及它们如何通过虚拟内存和DMA引擎实现高效通信。以下是详细的理解和梳理: 1. 基本概念 CPU 和 GPU 是两个独立的…

【单调队列】-----【原理+模版】

单调队列 一、什么是单调队列? 单调队列是一种在滑动窗口或区间查询中维护候选元素单调性的数据结构,通常用于解决“滑动窗口最大值/最小值”等问题。 核心思想是:利用双端队列(deque)维护当前窗口内或候选范围内元素…

CSS语法中的选择器与属性详解

CSS:层叠样式表,Cascading Style Sheets 层叠样式表 内容和样式分离解耦,便于修改样式。 特殊说明: 最后一条声明可以没有分号,但是为了以后修改方便,一般也加上分号为了使用样式更加容易阅读,可以将每条代…

模拟设计的软件工程项目

考核题目 论文论述题:结合你 参与开发、调研或模拟设计的软件工程项目 ,撰写一篇论文 完成以下任务,论文题目为《面向微服务架构的软件系统设计与建模分析》,总分: 100 分。 1. 考核内容: 一、系统论述…

个人理解redis中IO多路复用整个网络处理流

文章目录 1.redis网络处理流2.理解通知机制 1.redis网络处理流 10个客户端通过TCP与Redis建立socket连接,发送GET name指令到服务器端。服务器端的网卡接收数据,数据进入内核态的网络协议栈。Redis通过IO多路复用机制中的epoll向内核注册监听这些socket的…

【郑州轻工业大学|数据库】数据库课设-酒店管理系统

该数据课设是一个基于酒店管理系统的数据库设计 建库语句 create database hotel_room default charset utf8 collate utf8_general_ci;建表语句 use hotel_room;-- 房型表 create table room_type( id bigint primary key auto_increment comment 房型id, name varchar(50)…

TCP 三次握手与四次挥手详解

前言 在当今互联网时代,前端开发的工作范畴早已超越了简单的页面布局和交互设计。随着前端应用复杂度的不断提高,对网络性能的优化已成为前端工程师不可忽视的重要职责。而要真正理解并优化网络性能,就需要探究支撑整个互联网的基础协议——…