kazu22002の技術覚書

PHPer, Golang, AWS エンジニアの日々

golangとxormとoracle ~ Joinと取得カラム ~

golangのxormでJoinしたデータを取得する場合の注意点を書いてみます。(oracleは関係ないかな。)

github.com

同じカラム名

joinしたデータを取得する際に、xormのextendsオプションで取得する場合に、同じカラム名がある場合、指定する構造体により取得できるデータが変わります。

type USERS struct {
     ID int64 `xorm:"ID"`
     NAME string `xorm:"NAME"`
     MEMO string `xorm:"MEMO"`
}

type USERS_DATA struct {
    ID int64 `xorm:"ID"`
    USERS_ID int64 `xorm:"USERS_ID"`
    MEMO string `xorm:"MEMO"`
}

type USERS_JOIN_1 struct {
    USERS USERS `xorm:"extends"`
    USERS_DATA USERS_DATA `xorm:"extends"`
}

type USERS_JOIN_2 struct {
    USERS_DATA USERS_DATA `xorm:"extends"`
    USERS USERS `xorm:"extends"`
}
m := USERS_JOIN_1{}

SqlHandler.Table("USERS").
    Join("INNER", "USERS_DATA", "USERS.ID = USERS_DATA.USERS_ID").
    Find(&m)
    
m := USERS_JOIN_2{}

SqlHandler.Table("USERS").
    Join("INNER", "USERS_DATA", "USERS.ID = USERS_DATA.USERS_ID").
    Find(&m)
    

join1.goとjoin2.goは取得した内容を格納する構造体が違うだけですが、これだけで期待している取得データが変わってきます。

正解はちゃんと上から設定をする必要があるということです。

join2.goの場合に、USERS_DATAのパラメータにUSERSのMEMOが入っている状態になります。

プログラムする際には、取得する構造体にも気にする必要がありますね。

じゃあ、頑張りましょう。