REL v0.4.0发布:基于Golang的分层架构SQL数据库封装层

REL v0.4.0发布:基于Golang的分层架构SQL数据库封装层 变更日志:

  • 原始 SQL 查询构建器 (#58)
  • 变更集修改器 (#59)
  • 重构修改为变更 (#60)
  • 支持在 Changeset.Changes() 中为关联生成差异 (#62)
  • 传递变更器选项不应要求显式指定变更器 (#63)
  • 禁用级联更新的选项 (#64)
  • 级联删除 (#65)
  • [修复] 如果变更器为 nil 则默认模拟任何操作 (#66)
  • [文档] 测试事务示例 (#55)
  • [文档] 测试查询示例 (#54)
  • [文档] 修复文档错误 (#56)
  • [文档] 测试 CRUD 示例 (#57)
  • [文档] 测试关联示例 (#61)
  • [文档] 变更 (#67)

GitHub

Fs02/rel

用于分层架构的 Golang SQL 数据库层。 - Fs02/rel


更多关于REL v0.4.0发布:基于Golang的分层架构SQL数据库封装层的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于REL v0.4.0发布:基于Golang的分层架构SQL数据库封装层的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


REL v0.4.0 的发布带来了多项重要改进,特别是原始 SQL 查询构建器和变更集功能的增强。以下是对几个关键特性的技术分析:

原始 SQL 查询构建器

这个功能允许在保持类型安全的同时执行原始 SQL 查询。示例:

// 使用原始 SQL 进行查询
var users []User
err := repo.FindAll(ctx, &users, rel.SQL("SELECT * FROM users WHERE age > ?", 18))

// 结合其他查询条件
err = repo.FindAll(ctx, &users, 
    rel.Where(rel.Eq("status", "active")),
    rel.SQL("AND created_at > ?", time.Now().AddDate(0, -1, 0)),
)

变更集修改器增强

变更集现在支持更灵活的修改方式:

// 创建变更集并应用修改器
changeset := rel.NewChangeset(&user)
changeset.Modify(rel.Set("name", "John"), rel.Inc("version"))

// 批量修改
changeset.Modify(
    rel.Set("email", "john@example.com"),
    rel.Set("updated_at", time.Now()),
    rel.Inc("login_count"),
)

关联差异生成

Changeset.Changes() 现在可以检测关联数据的差异:

type User struct {
    ID    int
    Name  string
    Posts []Post `ref:"id" fk:"user_id"`
}

// 当修改用户的文章列表时,Changes() 会检测差异
user := User{ID: 1, Posts: []Post{{Title: "Old Post"}}}
changeset := rel.NewChangeset(&user)

// 修改关联数据
user.Posts = []Post{{Title: "New Post"}}
changes := changeset.Changes()
// changes 现在包含关联数据的变更信息

级联操作控制

新增了级联更新和删除的控制选项:

// 禁用级联更新
repo.Update(ctx, &user, rel.Cascade(false))

// 级联删除
repo.Delete(ctx, &user, rel.Cascade(true))

// 在事务中控制级联行为
txRepo, _ := repo.Begin(ctx)
defer txRepo.Rollback()

err := txRepo.Delete(ctx, &user, rel.Cascade(true))
if err != nil {
    txRepo.Rollback()
    return err
}
txRepo.Commit()

变更器选项传递优化

现在传递变更器选项更加简洁:

// v0.3.0 需要显式指定
repo.Update(ctx, &user, rel.Changeset(changeset))

// v0.4.0 可以隐式传递
repo.Update(ctx, &user, rel.Set("name", "John"), rel.Inc("version"))
// 或者
repo.Update(ctx, changeset)

事务和查询示例

文档中新增的示例展示了最佳实践:

// 事务示例
err := repo.Transaction(ctx, func(ctx context.Context) error {
    // 创建用户
    if err := repo.Insert(ctx, &user); err != nil {
        return err
    }
    
    // 创建关联记录
    profile := Profile{UserID: user.ID, Bio: "Developer"}
    return repo.Insert(ctx, &profile)
})

// 复杂查询示例
var activeUsers []User
err := repo.FindAll(ctx, &activeUsers,
    rel.Where(rel.Eq("status", "active")),
    rel.GroupBy("department"),
    rel.Having(rel.Gt("COUNT(*)", 5)),
    rel.OrderBy("created_at DESC"),
    rel.Limit(10),
    rel.Offset(0),
)

这些改进使 REL 在保持简洁 API 的同时,提供了更强大的数据库操作能力。原始 SQL 构建器特别有用,它允许在需要时使用原生 SQL,同时仍然受益于 REL 的类型安全和连接管理。

回到顶部