refactor(crud): 更新CRUD模块以兼容新的ORM接口

- 替换原有的GORM依赖为自定义orm包
- 修改Crud结构体泛型参数,移除C类型参数
- 更新数据库操作方法以适配新ORM接口
- 调整字段名转换逻辑,使用自定义的驼峰下划线转换函数
- 重构分页查询方法参数类型和返回值处理
- 移除GORM特有的Preload关联查询功能
- 更新Where条件构建器以匹配新ORM语法
- 调整错误处理机制以符合新的数据库操作接口
This commit is contained in:
maguodong
2026-04-03 14:52:39 +08:00
parent b52c4aa3c7
commit 6bbe8928e7
6 changed files with 1000 additions and 852 deletions
+20 -8
View File
@@ -13,22 +13,26 @@ type DAO struct {
}
// NewDAO 创建 DAO 基类实例
func NewDAO(db *Database) *DAO {
return &DAO{db: db}
// 自动使用全局默认 Database 实例
func NewDAO() *DAO {
return &DAO{
db: GetDefaultDatabase(),
}
}
// NewDAOWithModel 创建带模型类型的 DAO 基类实例
// 参数:
// - db: 数据库连接实例
// - model: 模型实例(指针类型),用于获取表结构信息
func NewDAOWithModel(db *Database, model interface{}) *DAO {
// 自动使用全局默认 Database 实例
func NewDAOWithModel(model interface{}) *DAO {
return &DAO{
db: db,
db: GetDefaultDatabase(),
modelType: model,
}
}
// Create 创建记录(通用方法)
// 自动使用 DAO 中已关联的 Database 实例
func (dao *DAO) Create(ctx context.Context, model interface{}) error {
// 使用事务来插入数据
tx, err := dao.db.Begin()
@@ -46,11 +50,13 @@ func (dao *DAO) Create(ctx context.Context, model interface{}) error {
}
// GetByID 根据 ID 查询单条记录(通用方法)
// 自动使用 DAO 中已关联的 Database 实例
func (dao *DAO) GetByID(ctx context.Context, model interface{}, id int64) error {
return dao.db.Model(model).Where("id = ?", id).First(model)
}
// Update 更新记录(通用方法)
// 自动使用 DAO 中已关联的 Database 实例
func (dao *DAO) Update(ctx context.Context, model interface{}, data map[string]interface{}) error {
pkValue := getFieldValue(model, "ID")
@@ -62,6 +68,7 @@ func (dao *DAO) Update(ctx context.Context, model interface{}, data map[string]i
}
// Delete 删除记录(通用方法)
// 自动使用 DAO 中已关联的 Database 实例
func (dao *DAO) Delete(ctx context.Context, model interface{}) error {
pkValue := getFieldValue(model, "ID")
@@ -73,16 +80,19 @@ func (dao *DAO) Delete(ctx context.Context, model interface{}) error {
}
// FindAll 查询所有记录(通用方法)
// 自动使用 DAO 中已关联的 Database 实例
func (dao *DAO) FindAll(ctx context.Context, model interface{}) error {
return dao.db.Model(model).Find(model)
}
// FindByPage 分页查询(通用方法)
// 自动使用 DAO 中已关联的 Database 实例
func (dao *DAO) FindByPage(ctx context.Context, model interface{}, page, pageSize int) error {
return dao.db.Model(model).Limit(pageSize).Offset((page - 1) * pageSize).Find(model)
}
// Count 统计记录数(通用方法)
// 自动使用 DAO 中已关联的 Database 实例
func (dao *DAO) Count(ctx context.Context, model interface{}, where ...string) (int64, error) {
var count int64
@@ -100,6 +110,7 @@ func (dao *DAO) Count(ctx context.Context, model interface{}, where ...string) (
}
// Exists 检查记录是否存在(通用方法)
// 自动使用 DAO 中已关联的 Database 实例
func (dao *DAO) Exists(ctx context.Context, model interface{}) (bool, error) {
count, err := dao.Count(ctx, model)
if err != nil {
@@ -109,6 +120,7 @@ func (dao *DAO) Exists(ctx context.Context, model interface{}) (bool, error) {
}
// First 查询第一条记录(通用方法)
// 自动使用 DAO 中已关联的 Database 实例
func (dao *DAO) First(ctx context.Context, model interface{}) error {
return dao.db.Model(model).First(model)
}
@@ -123,14 +135,14 @@ func (dao *DAO) First(ctx context.Context, model interface{}) error {
// *core.DAO
// }
//
// func NewUserDAO(db *core.Database) *UserDAO {
// func NewUserDAO() *UserDAO {
// return &UserDAO{
// DAO: core.NewDAOWithModel(db, &model.User{}),
// DAO: core.NewDAOWithModel(&model.User{}),
// }
// }
//
// // 使用
// dao := NewUserDAO(db)
// dao := NewUserDAO()
// cols := dao.Columns() // 返回 *struct{ID string; Username string; ...}
func (dao *DAO) Columns() interface{} {
// 检查是否有模型类型信息
+16
View File
@@ -8,6 +8,9 @@ import (
"git.magicany.cc/black1552/gin-base/db/driver"
)
// defaultDatabase 全局默认数据库连接实例
var defaultDatabase *Database
// NewDatabase 创建数据库连接 - 初始化数据库连接和相关组件
func NewDatabase(config *Config) (*Database, error) {
db := &Database{
@@ -59,6 +62,9 @@ func NewDatabase(config *Config) (*Database, error) {
fmt.Println("[Magic-ORM] 数据库连接成功")
}
// 设置为全局默认实例
defaultDatabase = db
return db, nil
}
@@ -126,3 +132,13 @@ func loadAndConnect(configPath string, debug bool) (*Database, error) {
// 简单方案:返回错误,提示使用 config 包
return nil, fmt.Errorf("请使用 config.AutoConnect() 方法")
}
// GetDefaultDatabase 获取全局默认数据库实例
func GetDefaultDatabase() *Database {
return defaultDatabase
}
// SetDefaultDatabase 设置全局默认数据库实例
func SetDefaultDatabase(db *Database) {
defaultDatabase = db
}