Bug 解决 数据查询为空或错误

解决数据查询为空或错误的问题通常涉及一系列步骤,从理解查询本身、检查数据源到验证查询逻辑和执行环境。

1. 验证数据源

  • 数据存在性:首先确认数据库中确实存在你期望查询的数据。
  • 数据类型和格式:检查数据类型和格式是否与查询中使用的相匹配。
  • 数据完整性:确认数据没有损坏或丢失。

2. 审查SQL查询

  • 语法检查:确保SQL查询的语法正确无误。
  • 条件过滤:检查WHERE子句中的条件是否过于严格,导致没有数据满足条件。
  • 连接(JOINs):如果你使用了JOINs,确认JOIN条件是否正确,以及是否所有的表都有相应的数据匹配。
  • 分组(GROUP BY)和排序(ORDER BY):检查这些子句是否按预期工作,特别是当它们涉及复杂的函数或计算时。

3. 检查索引

  • 索引使用:确认查询是否有效地利用了索引,尤其是在大数据集上。
  • 索引缺失:如果查询性能不佳或返回空结果,考虑是否缺少必要的索引。

4. 调试和日志

  • SQL日志:查看数据库的查询日志,了解查询的执行情况。
  • 调试工具:使用SQL IDE或数据库管理工具中的调试功能来逐步执行查询。
  • 错误消息:注意任何错误消息或警告,它们可能提供关于问题的线索。

5. 简化查询

  • 逐步简化:将复杂的查询分解为更小的部分,逐一测试以找到问题所在。
  • 使用子查询:将部分查询作为子查询执行,以隔离问题区域。

6. 验证外部依赖

  • API和服务:如果你的查询依赖于外部API或服务,验证这些服务是否按预期工作。
  • 环境差异:检查开发、测试和生产环境之间的差异,特别是数据库配置和版本。

7. 权限问题

  • 数据库权限:确认执行查询的数据库用户具有足够的权限来访问数据和执行查询。

8. 并发和锁

  • 锁争用:在高并发环境中,查询可能因为锁争用而无法返回预期结果。
  • 隔离级别:检查数据库的事务隔离级别,确保它们不会干扰查询结果。

9. 咨询和社区

  • 同事和团队:与同事或团队成员讨论问题,他们可能遇到过类似的问题。
  • 在线论坛和社区:利用Stack Overflow、Reddit的数据库相关子版块或特定数据库的官方论坛来寻求帮助。

解决步骤

#1、定位问题边界

首先要定位数据查询为空的错误边界。说简单一点,就是要确认是前端还是后端的锅。

要先从请求的源头排查,也就是前端浏览器,毕竟前端和后端是通过接口(请求)交互的。

在浏览器中按 F12 打开浏览器控制台,进入网络标签,然后刷新页面或重新触发请求,就能看到请求的信息了。

选中请求并点击预览,就能看到后端返回结果,有没有返回数据一看便知。

如果发现后端正常返回了数据,那就是前端的问题,查看自己的页面代码来排查为什么数据没在前端显示,比如是不是取错了数据的结构?可以多用 debugger 或 console.log 等方式输出信息,便于调试。

星球同学可以免费阅读前端嘉宾神光的《前端调试通关秘籍》:https://t.zsxq.com/13Rh4xxNK

如果发现后端未返回数据,那么前端需要先确认下自己传递的参数是否正确。

比如下面的例子,分页参数传的太大了,导致查不到数据:

如果发现请求参数传递的没有问题,那么就需要后端同学帮忙解决了。

通过这种方式,直接就定位清楚了问题的边界,高效~

#2、后端验证请求

接下来的排查就是在后端处理了,首先开启 Debug 模式,从接受请求参数开始逐行分析。

比如先查看请求参数对象,确认前端有没有按照要求传递请求参数:

毕竟谁能保证我们的同事(或者我们自己)不是小迷糊呢?即使前端说自己请求是正确的,但也必须要优先验证,而不是一上来就去分析数据库和后端程序逻辑的问题。

验证请求参数对象没问题后,接着逐行 Debug,直到要执行数据库查询。

#3、后端验证数据库查询

无论是从 MySQL、MongoDB、Redis,还是文件中查询数据,为了理解方便,我们暂且统称为数据库。

上一步中,我们已经 Debug 到了数据库查询,需要重点关注 2 个点:

1)查看封装的请求参数是否正确

对于 MyBatis Plus 框架来说,就是查看 QueryWrapper 内的属性是否正确填充了查询条件

2)查看数据库的返回结果是否有值

比如 MyBatis Plus 的分页查询中,如果 records 属性的 size 大于 0,表示数据库返回了数据,那么就不用再排查数据库查询的问题了;而如果 size = 0,就要分析为什么从数据库中查询的数据为空。

这一步尤为关键,我们需要获取到实际发送给数据库查询的 SQL 语句。如果你使用的是 MyBatis Plus 框架,可以直接在 application.yml 配置文件中开启 SQL 语句日志打印,参考配置如下:

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

代码已复制

1
2
3

然后执行查询,就能看到完整的 SQL 语句了:

把这个 SQL 语句复制到数据库控制台执行,验证下数据结果是否正确。如果数据库直接执行语句都查不出数据,那就确认是查询条件错误了还是数据库本身就缺失数据。

#4、后端验证数据处理逻辑

如果数据库查询出了结果,但最终响应给前端的数据为空,那么就需要在数据库查询语句后继续逐行 Debug,验证是否有过滤数据的逻辑。

比较典型的错误场景是查询出的结果设置到了错误的字段中、或者由于权限问题被过滤和脱敏掉了。

#最后

以后再遇到数据查询为空的情况,按照以上步骤排查问题即可。排查所有 Bug 的核心流程都是一样的,先搜集信息、再定位问题、最后再分析解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值