返回

Go语言学习教程:xorm表高级操作及查询功能解析

见解分享

Id值查询

Id值查询是指通过主键字段的值来查询表中的记录。例如:

id := 10
user, err := engine.Id(id).Get(&User{})
if err != nil {
    // handle error
}
fmt.Println(user)

上述代码表示查询主键值为10的用户记录并将其赋值给变量user。

复合主键查询

如果表的主键是复合主键,可以使用core.PK来传入主键的值:

type User struct {
    ID        int64  `xorm:"pk"`
    Name      string `xorm:"pk"`
    Age       int
    CreatedAt time.Time `xorm:"created"`
    UpdatedAt time.Time `xorm:"updated"`
}

id1 := 10
id2 := "John"
user, err := engine.Where(core.PK(id1, id2)).Get(&User{})
if err != nil {
    // handle error
}
fmt.Println(user)

上述代码表示查询主键值分别为10和"John"的用户记录。

连表查询

连表查询是指查询多个表之间的关联关系。xorm框架提供了多种方法进行连表查询,例如:

  • Join: 用于连接两个或多个表。
  • LeftJoin: 用于连接两个表,并返回左表中的所有记录,即使右表中没有匹配的记录。
  • RightJoin: 用于连接两个表,并返回右表中的所有记录,即使左表中没有匹配的记录。
  • InnerJoin: 用于连接两个表,并仅返回两个表中都有匹配记录的记录。

以下是一个连表查询的示例:

type User struct {
    ID        int64  `xorm:"pk"`
    Name      string `xorm:"pk"`
    Age       int
    CreatedAt time.Time `xorm:"created"`
    UpdatedAt time.Time `xorm:"updated"`
}

type Order struct {
    ID        int64  `xorm:"pk"`
    UserID    int64  `xorm:"index"`
    ProductID int64  `xorm:"index"`
    Quantity   int
    CreatedAt time.Time `xorm:"created"`
    UpdatedAt time.Time `xorm:"updated"`
}

engine.Join("LEFT", "orders", "orders.user_id = users.id").
    Where("users.name = ?", "John").
    Find(&users)

上述代码表示连接users表和orders表,并查询用户名为"John"的所有用户的订单记录。

条件查询

条件查询是指根据指定的条件来查询表中的记录。xorm框架提供了多种条件查询操作符,例如:

  • Eq: 等于
  • Ne: 不等于
  • Gt: 大于
  • Lt: 小于
  • Ge: 大于等于
  • Le: 小于等于
  • In: 在指定值列表中
  • NotIn: 不在指定值列表中

以下是一个条件查询的示例:

engine.Where("age > ?", 18).And("name = ?", "John").
    Find(&users)

上述代码表示查询年龄大于18且用户名为"John"的所有用户记录。

分组查询

分组查询是指根据指定的字段对表中的记录进行分组,并对分组后的数据进行统计。xorm框架提供了GroupHaving方法进行分组查询:

  • Group: 指定分组字段。
  • Having: 指定分组后数据的统计条件。

以下是一个分组查询的示例:

engine.Group("age").Having("COUNT(*) > 1").
    Find(&users)

上述代码表示查询年龄相同且用户数量大于1的所有年龄段。

排序查询

排序查询是指根据指定的字段对表中的记录进行排序。xorm框架提供了OrderBy方法进行排序查询:

  • OrderBy: 指定排序字段和排序方式(ASC升序或DESC降序)。

以下是一个排序查询的示例:

engine.OrderBy("age DESC").
    Find(&users)

上述代码表示查询所有用户记录,并按年龄降序排列。