数据库操作

XYGo Admin 2025-02-20 80 次阅读

DAO / Entity / DO 三层模型与数据库方言适配

数据库操作

三层模型

目录 说明 是否自动生成
Entity model/entity/ 数据库表结构映射,字段与表一一对应 ✅ gf gen dao
DO model/do/ 数据操作对象,所有字段类型为 any,用于 Where/Data ✅ gf gen dao
DAO dao/ 数据访问对象,提供 Ctx(ctx) 获取 Model ✅ gf gen dao

Entity 示例

go 复制代码
// model/entity/admin_user.go(自动生成,勿修改)
type AdminUser struct {
    Id        uint64 `json:"id"        orm:"id"`
    Username  string `json:"username"  orm:"username"`
    Password  string `json:"password"  orm:"password"`
    Status    int    `json:"status"    orm:"status"`
    CreatedAt uint64 `json:"createdAt" orm:"created_at"`
}

DAO 双层结构

go 复制代码
// dao/internal/admin_user.go(自动生成,勿修改)
// 包含表名、字段名常量、Ctx() 方法

// dao/admin_user.go(可扩展)
type adminUserDao struct { *internal.AdminUserDao }
var AdminUser = adminUserDao{internal.NewAdminUserDao()}

// 可以在这里添加自定义方法
func (d *adminUserDao) FindByUsername(ctx context.Context, username string) (*entity.AdminUser, error) {
    var user entity.AdminUser
    err := d.Ctx(ctx).Where("username", username).Scan(&user)
    return &user, err
}

常用操作

go 复制代码
// 查询列表
var list []entity.AdminUser
err := dao.AdminUser.Ctx(ctx).Page(1, 20).OrderDesc("id").Scan(&list)

// 条件查询
m := dao.AdminUser.Ctx(ctx)
if username != "" {
    m = m.WhereLike("username", "%"+username+"%")
}
if status > 0 {
    m = m.Where("status", status)
}

// 新增
_, err := dao.AdminUser.Ctx(ctx).Data(do.AdminUser{
    Username: "newuser",
    Status:   1,
}).Insert()

// 更新
_, err := dao.AdminUser.Ctx(ctx).Where("id", id).Data(do.AdminUser{
    Status: 2,
}).Update()

// 删除
_, err := dao.AdminUser.Ctx(ctx).Where("id", id).Delete()

// 事务
err := dao.AdminUser.Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
    // 事务内的操作
    return nil
})

数据库方言适配

项目通过 library/dbdialect/ 包实现 MySQL 和 PostgreSQL 的兼容:

  • 类型映射:自动转换数据类型差异
  • DDL 生成:代码生成器创建表时自动适配语法
  • 表前缀:统一使用 xy_,在 CLI 配置中通过 removePrefix 去除