本工具封装了 GORM 框架,提供了一套类型安全、链式调用的 CRUD 操作接口。通过泛型支持,实现了更简洁的数据库操作方式,并包含事务管理、错误处理等高级特性。
泛型仓库接口,T 表示模型类型
错误处理接口
| 方法 |
参数 |
返回值 |
说明 |
DB() |
- |
*gorm.DB |
获取底层 GORM 连接 |
Tx() |
- |
IRepo[T] |
使用现有事务或开启新事务 |
Begin() |
- |
IRepo[T] |
显式开启新事务 |
Commit() |
- |
IRepo[T] |
提交事务 |
Rollback() |
- |
IRepo[T] |
回滚事务 |
WithDB(*gorm.DB) |
数据库连接 |
IRepo[T] |
使用自定义 DB 连接 |
WithCtx(*context.Context) |
上下文 |
IRepo[T] |
设置上下文 |
Clone() |
- |
IRepo[T] |
克隆当前 Repo 实例 |
| 方法 |
参数 |
返回值 |
说明 |
OnErr(func(IRepoErrHandle[T])) |
错误处理函数 |
IRepo[T] |
设置自定义错误处理器 |
Err() |
- |
*err.Error |
获取操作错误 |
| 方法 |
参数 |
返回值 |
说明 |
Get() |
- |
*T |
查询单条记录(未找到返回nil) |
GetOrInit() |
- |
*T |
查询或初始化对象(未找到返回空结构体) |
List() |
- |
[]T |
查询列表数据 |
Count() |
- |
int64 |
统计数量 |
Page() |
- |
*Page |
分页查询(返回通用分页对象) |
PageT() |
- |
*PageT[T] |
泛型分页查询(包含类型化数据) |
Scan(dest any) |
目标对象 |
- |
扫描结果到指定对象 |
WithPage(page *Page) |
分页对象 |
IRepo[T] |
设置分页参数 |
| 方法 |
参数 |
返回值 |
说明 |
Create(*T) |
模型指针 |
int64 |
新增单条记录(返回影响行数) |
CreateBatch([]*T) |
模型切片 |
int64 |
批量新增记录 |
Save(*T) |
模型指针 |
int64 |
保存记录(存在更新,不存在新增) |
Update() |
- |
int64 |
执行更新(需先调用Set/SetMap) |
UpdateFull(*T) |
模型指针 |
int64 |
完整更新模型 |
Del() |
- |
int64 |
删除记录(需先调用条件方法) |
Set(string, any) |
字段名, 值 |
IRepo[T] |
设置单个更新字段 |
SetMap(map[string]any) |
字段映射 |
IRepo[T] |
批量设置更新字段 |
Exec(string, ...any) |
SQL, 参数 |
int64 |
执行原生SQL命令 |
Raw(string, ...any) |
SQL, 参数 |
IRepo[T] |
设置原生SQL查询 |
| 方法 |
参数 |
返回值 |
说明 |
Eq(string, any) |
字段, 值 |
IRepo[T] |
等于条件 |
NEq(string, any) |
字段, 值 |
IRepo[T] |
不等于条件 |
In(string, any) |
字段, 值 |
IRepo[T] |
IN 条件 |
Gt(string, any) |
字段, 值 |
IRepo[T] |
大于条件 |
Gte(string, any) |
字段, 值 |
IRepo[T] |
大于等于条件 |
Lt(string, any) |
字段, 值 |
IRepo[T] |
小于条件 |
Lte(string, any) |
字段, 值 |
IRepo[T] |
小于等于条件 |
Like(string, any) |
字段, 值 |
IRepo[T] |
模糊匹配 |
NotNull(string) |
字段 |
IRepo[T] |
非NULL条件 |
Null(string) |
字段 |
IRepo[T] |
NULL条件 |
Or(string, any) |
字段, 值 |
IRepo[T] |
OR条件 |
Where(string, ...any) |
条件, 参数 |
IRepo[T] |
自定义WHERE条件 |
Select(...string) |
字段列表 |
IRepo[T] |
指定查询字段 |
Omit(...string) |
字段列表 |
IRepo[T] |
排除字段 |
Desc(string) |
字段 |
IRepo[T] |
降序排序 |
Asc(string) |
字段 |
IRepo[T] |
升序排序 |
Limit(int64) |
数量 |
IRepo[T] |
限制结果数量 |
// 初始化Repo
userRepo := NewRepo[User]()
// 创建记录
newUser := &User{Name: "John", Age: 30}
userRepo.Create(newUser)
// 查询单条
user := userRepo.Eq("id", 123).Get()
// 更新记录
userRepo.Eq("id", 123).Set("age", 31).Update()
// 删除记录
userRepo.Eq("id", 456).Del()
err := userRepo.Tx(func (txRepo IRepo[User]) error {
// 转出方扣款
if affected := txRepo.Eq("id", 1).Set("balance", gorm.Expr("balance - ?", 100)).Update(); affected == 0 {
return errors.New("扣款失败")
}
// 接收方加款
if affected := txRepo.Eq("id", 2).Set("balance", gorm.Expr("balance + ?", 100)).Update(); affected == 0 {
return errors.New("加款失败")
}
return nil
})
if err != nil {
// 处理事务错误
}
- 链式调用:所有方法返回
IRepo[T] 接口,支持链式调用
- 类型安全:通过泛型确保模型类型一致性
- 错误处理:提供灵活的错误处理机制
- 事务支持:简化事务管理流程
- 条件构建:提供丰富的条件构建方法
注意:实际使用前需初始化全局数据库连接,并注册模型对应的错误处理器