我正在尝试通过一个简单的查询将两个表person
和profile
内部连接,这似乎可以很好地与mysql配合使用,但不适用于sqlx。
这是我的执行代码:
package main
import (
"fmt"
"github.com/jmoiron/sqlx"
_ "github.com/go-sql-driver/mysql"
)
type Person struct {
Id int64 `db:"id"`
Name string `db:"name"`
Email string `db:"email"`
}
type Profile struct {
Id int64 `db:"id"`
Face string `db:"face"`
Hair string `db:"hair"`
Person
}
func main() {
DB, err := sqlx.Connect("mysql", "root:hackinitiator@/dusk")
if err == nil {
fmt.Println("sucess!!")
}
var q []Profile
DB.Select(&q, "select person.id, person.name, person.email, profile.id, profile.face, profile.hair from profile left join person on person.id = profile.person_id")
fmt.Println(q)
}
mysql查询产生以下输出:
+------+------+---------+----+----------+--------+
| id | name | email | id | face | hair |
+------+------+---------+----+----------+--------+
| 1 | yoda | nomail | 1 | round | brown |
| 5 | han | nomail1 | 3 | circle | red |
| 6 | yun | nomail2 | 4 | triangle | yellow |
| 7 | chi | nomail3 | 5 | square | green |
+------+------+---------+----+----------+--------+
这很好,但是我的go程序未按预期响应。结构无法捕获个人资料ID(输出中为空),并且人员ID被个人资料ID取代。下面是输出(格式化):
[
{0 round brown {1 yoda nomail}}
{0 circle red {3 han nomail1}}
{0 triangle yellow {4 yun nomail2}}
{0 square green {5 chi nomail3}}
]
我无法弄清楚出了什么问题。
答案 0 :(得分:0)
您需要在db
结构中更改person
的名称,如下所述,因为将有两个具有相同名称的列,即id
,所以它仅扫描最后一个ID,即在您的profile
表中而不是对person
表进行扫描,因此请遵循以下结构。
type Person struct {
Id int64 `db:"pId"`
Name string `db:"name"`
Email string `db:"email"`
}
然后用as
为person.id
编写查询,例如
DB.Select(&q, "select (person.id) as pId, person.name, person.email, profile.id, profile.face, profile.hair from profile left join person on person.id = profile.person_id")
答案 1 :(得分:0)
该错误是由于从结果中返回两个id
列,但将结果存储在两个结构中具有相同字段名ID的结构中,您将其实例传递给DB.Select。尝试捕获单个id列并将其传递给struct。
传递多个列,但可以使用不同的列名称作为别名。列别名名称将是您要在其中扫描数据的Person结构中的字段,
type Person struct {
PersonId int64 `db:"personId"`
Name string `db:"name"`
Email string `db:"email"`
}
var q []Profile
DB.Select(&q, "select person.id as personId, person.name, person.email, profile.id, profile.face, profile.hair from profile left join person on person.id = profile.person_id")
fmt.Println(q)
答案 2 :(得分:0)
按照@zerkms提供的代码片段,我进行了一些更改,这些更改使我可以在没有错误且没有重命名db标签的情况下运行程序。 首先,我在个人档案struct中添加了以下代码,以使查询可以识别人员struct
Person `db:"person"`
在此之后,我将SQL查询字符串更改为以下代码
DB.Select(&q, `select person.id "person.id", person.name "person.name", person.email "person.email", profile.* from profile left join person on person.id = profile.person_id`)
避免重复@zerkms指出的列名