go - 如何使用 GORM 检查 CRUD 操作中的错误?

标签 go go-gorm

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

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 ,似乎有某种堆栈帧检查在继续之前检查错误,这意味着事务错误将默默地失败:

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

    if !scope.HasError() {
        // actually perform the 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 - 如何使用 GORM 检查 CRUD 操作中的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30361671/

相关文章:

ubuntu - 如何从源代码在我的 ubuntu 12.10 上安装 Go

go - 如何在 go 中获取私有(private) reflect.Value 的内容?

戈兰戈尔姆 : Is it possible to delete a record via a many2many relationship?

sql - Postgres无限 self 加入

go - 如何获得多对多的数据关联

go - 无法获取 parser.ParseDir 来解析 Import 语句

go - 如何通过嵌入式接口(interface)嵌入结构值: Composable Structs

go - bufio.Reader 和 bufio.Scanner 的功能和性能

go - db.First() 不使用主键名

mysql - GORM 在选择中使用显式列名