質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Q&A

解決済

1回答

1529閲覧

【Go】sqlxを使って、ネストした構造体にScanしたい

haru_ren

総合スコア48

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

0グッド

0クリップ

投稿2022/11/03 18:51

やりたいこと

  • sqlxを使って、ネストした構造体にScanしたい。

環境 

  • golang
  • sqlx

コード

下記のような構造体をSQLで取得した際に、sqlxでStructScanしたい。

go

1type Test struct { 2 Test1 []Test1 3} 4 5type Test1 struct { 6 ID int 7 Name string 8 Test2 []Test2 9} 10 11type Test2 struct { 12 ID int 13 Name string 14 Test3 []Test3 15} 16 17type Test3 struct { 18 ID int 19 Name string 20} 21

実際の処理

go

1// サンプルコードなので、errは握りつぶしています 2rows, _ := conn.NamedQuery( 3` 4// DBから3つのテーブル (Test1, Test2, Test3)をJoinした値を返すSQL 5` 6) 7 8test := []*Test{} 9// Test1構造体にTest1.IDとTest1.Nameを、Test2構造体にTest2.IDとTest2.Nameを、Test3構造体にTest3.IDとTest3.NameをScanしたい 10_ = sqlx.StructScan(rows, &test) 11

補足

Test1, Test2, Test3それぞれScanする方法も考えたのですが、よりドライに書きたいと思っています。
一括でScanする方法はないのでしょうか?
よろしくお願いいたします!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nobonobo

2022/11/03 23:57 編集

「1+N問題」を検索してみましょう。この問題の解決方法はいくつかトレードオフがあって、アプリの要件によって対処方法は変わります。 sqlx(あまり詳しいわけではないので参考程度に)はそれを自動解決するのではなくSliceScan機能は用意しているのでScannerインターフェース実装を各自頑張ってくださいというスタンスのように見えます。
guest

回答1

0

自己解決

nobonoboさんのコメントを参考にして、下記構成に変更し解決いたしました。
(nobonoboさんのコメントをベストアンサーにしようとしたのですが、押せなかったのでこちらに残します)

go

1type Test struct { 2 Test1 *Test1 3 Test2 *Test2 4 Test3 *Test3 5} 6 7type Test1 struct { 8 ID int 9 Name string 10} 11 12type Test2 struct { 13 ID int 14 Name string 15} 16 17type Test3 struct { 18 ID int 19 Name string 20}

投稿2022/11/04 06:58

haru_ren

総合スコア48

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問