GORM v2调用db.First无数据时自动打印错误日志如何禁用
GORM V2 禁用
record not found默认日志输出方案 方案1:全局禁用(推荐)
GORM v2 原生支持在日志配置中设置忽略ErrRecordNotFound错误,仅需在初始化数据库实例时配置Logger的IgnoreRecordNotFoundError参数为true即可。该配置不影响业务代码中通过errors.Is(err, gorm.ErrRecordNotFound)判断无记录的逻辑,仅会停止输出对应的错误日志。
示例代码:
import ( "log" "os" "time" "gorm.io/gorm" "gorm.io/gorm/logger" // 导入对应数据库驱动,比如postgres、mysql等 ) // 初始化自定义Logger customLogger := logger.New( log.New(os.Stdout, "\r\n", log.LstdFlags), // 日志输出位置,可替换为自有日志组件 logger.Config{ SlowThreshold: time.Second, // 慢SQL阈值,按需配置 LogLevel: logger.Warn, // 日志级别,按需配置 IgnoreRecordNotFoundError: true, // 核心配置:忽略RecordNotFound错误不输出日志 Colorful: true, // 是否开启彩色日志,按需配置 }, ) // 初始化GORM DB实例时传入自定义Logger db, err := gorm.Open(你的数据库驱动实例, &gorm.Config{ Logger: customLogger, })
方案2:单次查询临时禁用
如果不需要全局修改,仅希望部分查询不输出record not found日志,可以通过会话级别的Logger配置实现:
// 为当前查询单独创建忽略RecordNotFound错误的Logger tmpLogger := logger.New( log.New(os.Stdout, "\r\n", log.LstdFlags), logger.Config{ IgnoreRecordNotFoundError: true, }, ) // 使用session配置临时Logger执行查询 if err := db.Session(&gorm.Session{Logger: tmpLogger}).First(&AoiArea{}).Error; errors.Is(err, gorm.ErrRecordNotFound) { // 自定义业务处理 }
方案3:使用Find替代First
First、Last、Take三个方法是GORM封装的单条记录查询方法,无匹配记录时会返回ErrRecordNotFound错误,而Find方法无匹配记录时仅返回空结果集、不会抛出该错误,自然也不会输出对应日志:
var aoiList []AoiArea // Limit(1)实现和First一致的查询逻辑 if err := db.Limit(1).Find(&aoiList).Error; err != nil { // 处理数据库层面的真实错误 } if len(aoiList) == 0 { // 无匹配记录的自定义业务处理 }
内容的提问来源于stack exchange,提问作者Arif
相关产品推荐
相关产品推荐

