QueryBuilder 构造复杂查询

QueryBuilder 提供了一个简便,流畅的 SQL 查询构造器。在不影响代码可读性的前提下用来快速的建立 SQL 语句。

QueryBuilder 在功能上与 ORM 重合, 但是各有利弊。ORM 更适用于简单的 CRUD 操作,而 QueryBuilder 则更适用于复杂的查询,例如查询中包含子查询和多重联结。

使用方法:

  1. // User 包装了下面的查询结果
  2. type User struct {
  3. Name string
  4. Age int
  5. }
  6. var users []User
  7. // 获取 QueryBuilder 对象. 需要指定数据库驱动参数。
  8. // 第二个返回值是错误对象,在这里略过
  9. qb, _ := orm.NewQueryBuilder("mysql")
  10. // 构建查询对象
  11. qb.Select("user.name",
  12. "profile.age").
  13. From("user").
  14. InnerJoin("profile").On("user.id_user = profile.fk_user").
  15. Where("age > ?").
  16. OrderBy("name").Desc().
  17. Limit(10).Offset(0)
  18. // 导出 SQL 语句
  19. sql := qb.String()
  20. // 执行 SQL 语句
  21. o := orm.NewOrm()
  22. o.Raw(sql, 20).QueryRows(&users)

完整 API 接口:

  1. type QueryBuilder interface {
  2. Select(fields ...string) QueryBuilder
  3. ForUpdate() QueryBuilder
  4. From(tables ...string) QueryBuilder
  5. InnerJoin(table string) QueryBuilder
  6. LeftJoin(table string) QueryBuilder
  7. RightJoin(table string) QueryBuilder
  8. On(cond string) QueryBuilder
  9. Where(cond string) QueryBuilder
  10. And(cond string) QueryBuilder
  11. Or(cond string) QueryBuilder
  12. In(vals ...string) QueryBuilder
  13. OrderBy(fields ...string) QueryBuilder
  14. Asc() QueryBuilder
  15. Desc() QueryBuilder
  16. Limit(limit int) QueryBuilder
  17. Offset(offset int) QueryBuilder
  18. GroupBy(fields ...string) QueryBuilder
  19. Having(cond string) QueryBuilder
  20. Update(tables ...string) QueryBuilder
  21. Set(kv ...string) QueryBuilder
  22. Delete(tables ...string) QueryBuilder
  23. InsertInto(table string, fields ...string) QueryBuilder
  24. Values(vals ...string) QueryBuilder
  25. Subquery(sub string, alias string) string
  26. String() string
  27. }

目前支持Postgress, MySQLTiDB的支持。