将错误转换为map或struct

时间:2017-12-29 18:51:47

标签: go go-gorm

刚开始使用Go,目前正在尝试创建REST API。使用gorm& gin也是这样做的。卡住的地方是,我试图从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将其放入地图&然后最后使用它。

有更简单的方法吗?

1 个答案:

答案 0 :(得分:1)

将其断言至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