关于 Golang 不处理数据库操作的 error 的一点思考

201 天前
 maotao456

事情的起因是这样的。 一个方法要查询 N 次数据库,每一次查询都要 if err , 我实在受不了啦,思索一番后觉得 似乎并不需要在运行时处理数据库操作的 error 。结论如下:

因为运行时的 error 大概率是连接,基建问题。 如果是 sql 语句问题,早就该在测试环节就发现。 既然是连接问题,那么一个查询报错,其它所有查询都会报错, 所以在每一个查询的地方都做 err check 是没有意义的。

可是不处理 err 怎么知道数据库有问题呢,怎么保证业务的完整呢?我大概理出了三板斧:

  1. query 的操作不处理 err ,sql 问题留到测试期解决
  2. update, insert 类操作要处理 err, 保证数据安全
  3. 对这些操作做一层包装和封装,每次调用记录 error ,监控该报警报警

当然,我不确定我这个想法是否考虑周到,可能以偏概全了。 欢迎大家一起讨论一下。

2656 次点击
所在节点    Go 编程语言
38 条回复
qq976739120
201 天前
不要忽略任何错误.哪怕打个日志也好. 用上模板写个 if err 也就一秒. 万一出问题帮你节省的时间起码几小时.
Morii
201 天前
之前写 gorm 的时候,无查询结果时也会有 err 不知道现在是什么样了
codehz
201 天前
数据库查询错误,可能是数据库迁移没做好,这个测试环境可能无法复现(因为生产环境和测试环境很有可能用的不是同一个数据库,注意这里的错误不一定指的是某个表不存在,而是说可能出现一些异常数据导致查询错误)
lsk569937453
201 天前
必须要每个 error 都处理。

我就说一个最简单的场景,一个请求进来,判断是不是合法用户(根据 token 查询数据库中是否存在),如果不存在,则在爬虫表里记录该请求的信息。
伪代码大概如下:

var count int64
err1 := dao.TestDb.Model(&dao.UserDao{}).Count(&count).Error
//用户信息表里没有,则记录爬虫
if count==0{
err2:= dao.TestDb.Create(userDao)
}

如果一个合法用户的请求进来,因为网络抖动出错了,也会导致 count=0 并且 err1 不为空,你没有处理 err1,所以后面 insert 成功了(你无法猜测网络波动的时间,只能尽可能的去处理所有的 error)。
hellodudu86
201 天前
线上出现问题的时候,你就会后悔没有每个 err 都处理并打印日志了
inhzus
201 天前
写代码一时爽,查线上问题火葬场
mcfog
201 天前
goland 生产力搞起,输入
err.rr
按 tab
见证奇迹
guanzhangzhang
201 天前
每个 err 都要处理,更何况设计到网络这种的
liyunlong41
201 天前
很多因素会导致数据库报错,cpu 、内存、磁盘、其它慢 sql 影响、db 的定时任务、机器老化等。甚至使用的 orm 库可能有 bug ,导致某些正常连接有问题。建议还是每个错误都捕获,写 err 麻烦的话,goland 敲 err 然后直接 tab 键就自动补全了。
chaleaochexist
201 天前
在 copilot 的帮助下, 没有太大问题.
考虑到费用问题, 也有很多免费的替代, 今天北大刚出了一款类似产品.
dobelee
201 天前
查线上问题的时候你把不得每行一条 log 。
monster1priest
201 天前
能处理就处理,处理不了就抛出去,但是永远不要吞异常,
k9982874
201 天前
一楼说的没错,你起码要打个 log ,不然线上出问题,找到你这你说不清楚这锅就得你背
Sendya
201 天前
@Morii First Last 查询 API 为单条查询设计,查询不到时会 ErrRecordNotFound 错误,使用 Take API 查询单条时,查询不到不会报错。应该是使用 API 的问题
Morii
201 天前
@Sendya 那可能是我对 Gorm 不熟悉的问题
zhangyq008
201 天前
没必要,err 该处理处理
ychost
201 天前
还是打印日志为妙
CEBBCAT
201 天前
有一些 fail fast 的文档,这会儿时间不多,可以 Google 「 program design check error rare panic OR fail 」
dw2693734d
201 天前
其实 postgres 已经把错误日志收集了
dqzcwxb
201 天前
谢谢你对测试的信任

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/983809

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX