我的问题简而言之:我可以使用sqlx的StructScan来填充两个嵌入式结构,其值来自同一个连接两次的SQL表吗?
有用的sqlx包的help files说明:
StructScan将在Person.AutoIncr.ID中设置id列结果,也可以作为Person.ID访问。为避免混淆,建议您使用AS在SQL中创建列别名。
假设我有这个SQL查询(父子,人到电话):
func getSQL() string {
return `SELECT *
FROM person
LEFT JOIN phones AS Phone1 ON Phone1.phone_id = person_phoneID1
LEFT JOIN phones AS Phone2 ON Phone2.phone_id = person_phoneID2
WHERE people_id = 1;`
}
使用sqlx和StructScan,我想填充一个充满嵌入式结构的结构,如下所示:
//Struct with embedded structs
type personHelper struct{
Person
Phone1 //Should I use the same name as SQL table alias?
Phone2
}
type Phone1 struct {
Phone //Underlying struct
}
type Phone2 struct{
Phone
}
//Base structs, with tags to match up fields
type Person struct{
ID `db:"person_id"`
Name `db:"person_name"`
Phone1 `db:"person_phoneID1"`
Phone2 `db:"person_phoneID2"`
}
type Phone struct{
ID int64 `db:"phone_id"`
Number string `db:"phone_no"`
//etc.
}
我可能有这样的功能:
func getPeople(){
parseRows := func(rows *sqlx.Rows) {
for rows.Next() {
var ph personHelper
err := rows.StructScan(&ph)
if err != nil{
//etc.
}
}
}
sql := getSQL()
sqlutils.GetRows(parseRows, sql)//GetRows executes the SQL query and returns rows for processing
}
我可以填充一个电话号码,但不能同时填充两个。我不确定我是否正确理解别名指令。
我很感激任何见解。
感谢。