go - 将错误转换为映射或结构

标签 go go-gorm

刚开始使用 Go,目前正在尝试创建 REST API。使用 gormgin 来做同样的事情。我被卡住的地方是,我试图从 error 对象中获取一个值,但我无法以直接的方式做到这一点。

error 类型,如果我没记错的话,只有一个 Error 方法可用,它给出 Message 部分中的任何内容目的。这是我的错误对象。

{
    "Severity": "ERROR",
    "Code": "23505",
    "Message": "duplicate key value violates unique constraint \"uix_users_email\"",
    "Detail": "Key (email)=(johndoe@gmail.com) already exists.",
    "Hint": "",
    "Position": "",
    "InternalPosition": "",
    "InternalQuery": "",
    "Where": "",
    "Schema": "public",
    "Table": "users",
    "Column": "",
    "DataTypeName": "",
    "Constraint": "uix_users_email",
    "File": "nbtinsert.c",
    "Line": "433",
    "Routine": "_bt_check_unique"
}

现在,我想做的是访问 Detail 键,但有点困惑。这是我目前为实现这一目标所做的工作:

if err := a.DB.Create(&user).Error; err != nil {
    val, _ := json.Marshal(err)
    m := make(map[string]string)
    json.Unmarshal(val, &m)
    context.JSON(422, gin.H{"error": m["Detail"]})
    return
}

但这似乎有点矫枉过正。我必须 Marshal 错误,然后 Unmarshal 将其放入映射中,最后使用它。

有没有更简单的方法来做到这一点?

最佳答案

将其断言给 pq.Error 并访问字段 as explained in the pq docs :

if err, ok := err.(*pq.Error); ok {
    fmt.Println("pq error:", err.Code.Name())
    // Or whatever other field(s) you need
}

full type is also documented .

关于go - 将错误转换为映射或结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48027084/

相关文章:

go - 在执行并行表测试用例时,如何推迟测试服务器的关闭?

go - 如何获取目录总大小?

postgresql - 我如何在 gorm 1.20.0 中关闭数据库实例

去建立错误 "db.GetUsers undefined (type *gorm.DB has no field or method GetUsers)"

go - 我无法将数据分配给 []map[string]interface{}

go - 是否可以使用 dgo 检索当前模式

go - LinkError : WebAssembly. instantiate() : Import #. .. 模块 ="env"函数 ="memcpy"错误:函数导入需要可调用

javascript - 无法将图像发送到 Go 服务器

database - GORM 中的复杂更新

database - Go 和 Postgresql 中带有 gorm 的十进制类型