使用sqlx,从连接两次的表中填充嵌入式结构

时间:2018-01-10 05:55:48

标签: go sqlx

我的问题简而言之:我可以使用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     
}

我可以填充一个电话号码,但不能同时填充两个。我不确定我是否正确理解别名指令。

我很感激任何见解。

感谢。

0 个答案:

没有答案