本文档是 xb/doc/BUILDER_BEST_PRACTICES.md 的中文版本。它总结了团队在实践中使用的约定,以保持构建器的可预测性和可读性。
ListUserRequest)。*uint64 或 *string 可以区分”未设置”和”零值”。Eq 之前,将用户字符串转换为类型化常量。| 技巧 | 为什么有帮助 |
|---|---|
| 将相关条件分组 | 更容易扫描,可通过辅助函数复用 |
使用 Cond(func(cb *CondBuilder)) |
比手动括号堆叠 Or() 调用更好 |
| 保持方法顺序一致 | Select → From → Join → Where → Sort → Limit 镜像 SQL |
| 避免在闭包内产生副作用 | 构建器是纯数据;将 IO 保持在外部 |
func addTenantGuard(b *xb.Builder, tenantID uint64) *xb.Builder {
return b.Eq("tenant_id", tenantID)
}
func addPagination(b *xb.Builder, req *PageRequest) *xb.Builder {
return b.Limit(req.Limit()).Offset(req.Offset())
}
Meta(func(*interceptor.Metadata)) 嵌入 TraceID、UserID 或 RequestID。built.Raw() 转储,以便快速进行回归诊断。InRequired、Bool、X 和 Sub 在自动过滤不够时提供精确控制。DELETE FROM table。doc/cn/FILTERING.mddoc/cn/CUSTOM_INTERFACE.mddoc/cn/TESTING_STRATEGY.md