数据库操作
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去除