3 回答
TA贡献1821条经验 获得超4个赞
lib/pq包可能会返回类型*pq.Error为 struct 的错误。如果是这样,您可以使用其所有字段来检查错误的详细信息。
这是可以做到的:
if err, ok := err.(*pq.Error); ok {
// Here err is of type *pq.Error, you may inspect all its fields, e.g.:
fmt.Println("pq error:", err.Code.Name())
}
pq.Error 具有以下字段:
type Error struct {
Severity string
Code ErrorCode
Message string
Detail string
Hint string
Position string
InternalPosition string
InternalQuery string
Where string
Schema string
Table string
Column string
DataTypeName string
Constraint string
File string
Line string
Routine string
}
这些字段的含义和可能的值是 Postres 特定的,完整列表可以在这里找到:错误和通知消息字段
TA贡献1834条经验 获得超8个赞
你可以使用这个:https ://github.com/omeid/pgerror
它有很多针对各种 postgres 错误的映射。
使用该软件包,您可以执行以下操作(摘自自述文件):
// example use:
_, err = stmt.Exec(SomeInsertStateMent, params...)
if err != nil {
if e := pgerror.UniqueViolation(err); e != nil {
// you can use e here to check the fields et al
return SomeThingAlreadyExists
}
return err // other cases.
}
TA贡献1858条经验 获得超8个赞
这个包有所有的 PG 错误常量: https ://github.com/jackc/pgerrcode
只需导入即可:
import "github.com/jackc/pgerrcode"
// ...
if err, ok := err.(*pq.Error); ok {
if err.Code == pgerrcode.UniqueViolation {
return fmt.Errorf("unique field violation on column %s", err.Column)
}
}
该软件包也属于 2 或 3 个最流行的 Go PostgreSQL 驱动程序之一,称为“pgx”,因此它应该足够可靠。
- 3 回答
- 0 关注
- 300 浏览
添加回答
举报