dberr

package
v0.3.6 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 6, 2026 License: Apache-2.0 Imports: 2 Imported by: 0

Documentation

Overview

Package dberr 把数据库驱动错误翻译为 pkg/errors 的 *Status, 让仓储层只抛原生 driver error,中间件/网关层统一拿到带业务码的错误。

错误翻译层:

  • 驱动层只产 error,业务层调 Translate(err) 得到带 Code 的 *Status;
  • 翻译分两步:Driver.Classify(err) → ErrClass(枚举),再按表映射到 Code;
  • ErrClass 是 DB 无关的稳定分类(唯一约束、外键、可空、死锁、超时、连接断开...), 各 driver 适配器各自实现 Classify,业务层只认 ErrClass。

零值不可用,用 New 构造。Translator 与各 Driver 适配器并发安全(只读映射)。

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Driver

type Driver interface {
	Classify(err error) ErrClass
}

Driver 把底层 driver error 归类为 ErrClass。 实现方对接具体驱动(pgx/mysql/go-sql-driver/sqlite...),只暴露这一个方法。

type ErrClass

type ErrClass int

ErrClass 数据库错误的稳定分类(DB 无关)。

const (
	ClassUnknown             ErrClass = iota // 未能识别
	ClassUniqueViolation                     // 唯一约束冲突(重复键)
	ClassForeignKeyViolation                 // 外键约束冲突
	ClassNotNullViolation                    // 非空约束冲突
	ClassCheckViolation                      // check 约束冲突
	ClassDeadlock                            // 死锁/序列化失败
	ClassTimeout                             // 查询超时
	ClassConnection                          // 连接断开/不可达
	ClassNotFound                            // 行不存在(影响 0 行的 NoRows)
	ClassTooManyRows                         // 期望单行却返回多行
)

type ErrorIsDriver

type ErrorIsDriver struct {
	Rules []ErrorIsRule
}

ErrorIsDriver 用 errors.Is 做归类:适合标准库 database/sql 的 ErrBadConn/ErrTainted 以及 driver 自身导出的哨兵 error。每条规则按顺序匹配,命中即返回。

func (ErrorIsDriver) Classify

func (d ErrorIsDriver) Classify(err error) ErrClass

Classify 按规则顺序匹配第一个命中的 errors.Is。

type ErrorIsRule

type ErrorIsRule struct {
	Target error
	Class  ErrClass
}

ErrorIsRule 一条 errors.Is 归类规则。

type NoopDriver

type NoopDriver struct{}

NoopDriver 把所有错误归为 ClassUnknown。无 DB 依赖时的占位。

func (NoopDriver) Classify

func (NoopDriver) Classify(error) ErrClass

type Option

type Option func(*config)

Option 配置 Translator。

func WithDriver

func WithDriver(d Driver) Option

WithDriver 指定驱动适配器。必填。

func WithMapping

func WithMapping(class ErrClass, code perr.Code) Option

WithMapping 覆盖某 ErrClass → Code 的映射(可多次调用)。

type Translator

type Translator struct {
	// contains filtered or unexported fields
}

Translator 把 ErrClass 翻译为 *pkg/errors.Status。

func New

func New(opts ...Option) *Translator

New 创建 Translator。driver 为空时所有错误都归为 ClassUnknown。

func (*Translator) Class

func (t *Translator) Class(err error) ErrClass

Class 返回 err 的 ErrClass(经 driver 归类)。便于业务层做条件分支。

func (*Translator) Is

func (t *Translator) Is(err error, class ErrClass) bool

Is 判断 err 是否属于某 ErrClass(经 driver 归类)。

func (*Translator) Translate

func (t *Translator) Translate(err error) *perr.Status

Translate 把底层 error 翻译为 *Status。 err 已是 *errors.Status 时原样返回;无 driver 时回退到 CodeInternal。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL