How to do joins in PostgreSQL using ozzo-dbx package?

huangapple go评论103阅读模式
英文:

How to do joins in PostgreSQL using ozzo-dbx package?

问题

我正在使用Go语言创建REST API,并且希望在请求时发送包含对象数据和另一个表中的一些子数据的响应。基本上是在表之间进行JOIN操作。

我正在使用这个包:https://github.com/go-ozzo/ozzo-dbx

在文档中,我没有找到JOIN的示例。

你能帮我解决这个问题吗?

我的代码:

这是一个简单的SELECT * FROM cars查询:

func (dao *BikesDAO) Query(rs app.RequestScope, offset, limit int) ([]models.Bikes, error) {
    bikes := []models.Bikes{}
    err := rs.Tx().Select().OrderBy("name").Offset(int64(offset)).Limit(int64(limit)).All(&bikes)
    return bikes, err
}

我的结构体:

type Bikes struct {
    Id           int     `json:"id" db:"id"`
    Name         string  `json:"name" db:"name"`
    Rating       float64 `json:"rating" db:"rating"`
    PriceValue   uint    `json:"price_value" db:"price_value"`
    Users        Users
}

type Users struct {
    Id       string  `json:"id" db:"id"`
    Username string  `json:"username" db:"username"`
    Name     string  `json:"name" db:"name"`
    Phone    string  `json:"phone" db:"phone"`
    Email    string  `json:"email" db:"email"`
}

我想要执行SELECT * FROM cars INNER JOIN users ON cars.user_id = users.id,并获得以下结果:

{
    "id": 12,
    "name": "Toyota",
    "rating": 4,
    "price_value": 4000,
    "users": {
        "id": 64,
        "Username": "Tom32",
        "Name": "Tom",
        "Phone": "325345345",
        "Email": "tom@gmail.com"
    }
}
英文:

I am creating REST API in Go. And I want on request send the response with data about the object + some subdata about it which is another table. So basically do JOIN between tables.

I am using this package: https://github.com/go-ozzo/ozzo-dbx.

In the documentation, I failed to find JOIN examples.

Could you help me to solve this?

My code:

This does simple SELECT * FROM cars

func (dao *BikesDAO) Query(rs app.RequestScope, offset, limit int) ([]models.Bikes, error) {
bikes := []models.Bikes{}
err := rs.Tx().Select().OrderBy("name").Offset(int64(offset)).Limit(int64(limit)).All(&bikes)
return bikes, err
}

My structs:

type Bikes struct {
  Id                     int     `json:"id" db:"id"`
  Name                   string  `json:"name" db:"name"`
  Rating                 float64 `json:"rating" db:"rating"`
  PriceValue             uint    `json:"price_value" db:"price_value"`
  Users                  Users
}

type Users struct {
  Id             string  `json:"id" db:"id"`
  Username       string  `json:"username" db:"username"`
  Name           string  `json:"name" db:"name"`
  Phone          string  `json:"phone" db:"phone"`
  Email          string  `json:"email" db:"email"`
}

With this I want to do SELECT * FROM cars INNER JOIN users ON cars.user_id = users.id and get the following result:

{
 "id":12, 
 "name":"Toyota",
 "rating":4,
 "price_value":4000,
 "users": {
            "id":64,
            "Username":"Tom32",
            "Name":"Tom",
            "Phone":"325345345",
            "Email":"tom@gmail.com"
           }
 }

答案1

得分: 1

在对dbx包的代码进行一些挖掘后,我发现它非常简单:

err := rs.Tx().Select().InnerJoin("table2", dbx.NewExp("table2.id = table1.id").OrderBy("name").Offset(int64(offset)).Limit(int64(limit)).All(&bikes)

英文:

After some digging in dbx package code I have found that it's quite easy:

err := rs.Tx().Select().InnerJoin("table2", dbx.NewExp("table2.id = table1.id").OrderBy("name").Offset(int64(offset)).Limit(int64(limit)).All(&bikes)

huangapple
  • 本文由 发表于 2017年7月5日 22:11:39
  • 转载请务必保留本文链接:https://go.coder-hub.com/44928638.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定