GORM的official documentation说明了一种可以测试记录是否存在的方法,即:

user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}

// returns true if record hasn’t been saved (primary key `Id` is blank)
db.NewRecord(user) // => true

db.Create(&user)

// will return false after `user` created
db.NewRecord(user) // => false

这可用于间接测试记录创建过程中的错误,但在发生故障时不报告任何有用信息.

在判断了source code for db.Create之后,似乎有某种堆栈帧判断,在继续之前判断错误,这意味着事务性错误将silent地失败:

func Create(scope *Scope) {
    defer scope.Trace(NowFunc())

    if !scope.HasError() {
        // actually perform the transaction
    }
}
  • 这是个窃听器,还是我漏掉了什么?
  • How can/should I be informed of a failed transaction?
  • 在哪里可以获得有用的调试信息?

推荐答案

DB.Create()返回一个新的(克隆的)gorm.DB,它是一个struct,有一个字段Error:

type DB struct {
    Value        interface{}
    Error        error
    RowsAffected int64
    // contains filtered or unexported fields
}

您可以存储返回的*gorm.DB值并判断其DB.Error字段,如下所示:

if dbc := db.Create(&user); dbc.Error != nil {
    // Create failed, do something e.g. return, panic etc.
    return
}

如果您不需要返回gorm.DB中的其他内容,可以直接判断它的Error字段:

if db.Create(&user).Error != nil {
    // Create failed, do something e.g. return, panic etc.
    return
}

Go相关问答推荐

区分Terminal和Hook Zerolog Go中的错误级别日志(log)输出

Go GORM创建表,但不创建列

如何在Golang中获取mp3文件的持续时间?

如何确定泛型类型在运行时是否可比较?

如何使用 AWS sdk 在 Go 中正确解组 PartiQL 查询的结果?

这是go语言gin提供的关于TypeEngine和RouterGroup的问题

使用golang sqlc中的引用参数

Golang 到 wasm 编译使用 tinygo.使用 wasmtime 执行

golang中如何声明多个接口约束?

创建新对象后如何返回嵌套实体?

Gorm delete with clauses sqlmock 测试

如何处理 Go 的 firebase admin sdk 错误?

具有未导出字段的 struct 类型之间的转换

Go 泛型:自引用接口约束

在 docker kill --signal=SIGX 上以这种方式关闭容器内运行的 go 应用程序是否安全?

如何在gin中获取参数值数组

使用 bolthold 3 条件进行 boltDB 查询

Terraform 自定义提供程序 - 数据源架构

如何使用 context.WithCancel 启动和停止每个会话的心跳?

是否存在一个Go泛型类型约束,该约束捕获了将类型用作映射中的键的能力?