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

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

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

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Q&A

1回答

674閲覧

golang+Echo+Mysqlで1:nのJSONを複数返す。

退会済みユーザー

退会済みユーザー

総合スコア0

Go

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

0グッド

0クリップ

投稿2018/09/04 06:07

編集2022/01/12 10:55

わからないこと

AuthorとBooksの関係は1:nとします。複数のAuthorを全出力する方法がわかりません。
EchoフレームワークとMysqlDBを用いています。

つまり、下記のコードにおいて、ResponseAuthorsをJSON出力したいです。
ResponseAuthor(単体)についてはJSON出力を試行錯誤の末できるようになりました。

{ authors: [ { id: 6, name: "Taro", books: null // ← ここを出力させたい!!!! }, { id: 7, name: "Tanaka", books: null //  ← ここを出力させたい!!!! }, { id: 8, name: "Masato", books: null //  ← ここを出力させたい!!!! } ] }

前提コード

DBに値は格納されているとします。

go

1 2var ( 3 authortable = "authorinfo" 4 booktable = "bookinfo" 5 seq = 1 6 conn, err = dbr.Open("mysql", "root:@tcp(localhost:3306)/workout", nil) 7 sess = conn.NewSession(nil) 8) 9 10Author struct { 11 Id int `db:"id" json:"id"` 12 Name string `db:"name" json:"name"` 13} 14 15// DB BookInfo table 16Book struct { 17 Id int `db:"id" json:"id"` 18 AuthorId int `db:"author_id" json:"author_id"` // FK 19 Name string `db:"name" json:"name"` 20} 21 22ResponseAuthors struct { 23 Authors []ResponseAuthor `json:"authors"` 24} 25 26ResponseAuthor struct { 27 Id int `json:"id"` 28 Name string `json:"name"` 29 Books []ResponseBook `json:"books"` 30} 31 32ResponseBook struct { 33 Id int `json:"id"` 34 AuthorId int `json:"author_id"` // FK 35 Name string `json:"name"` 36} 37 38ResponseBooks struct { 39 Books []ResponseBook `json:"books"` 40}
-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(50) | NO | | NULL | | +-------+-------------+------+-----+---------+----------------+
+-----------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | author_id | int(11) | NO | | NULL | | | name | varchar(50) | NO | | NULL | | +-----------+-------------+------+-----+---------+----------------+
func main() { // Generate Instance e := echo.New() // MiddleWare e.Use(middleware.Logger()) e.Use(middleware.Recover()) ////////// ここについての質問 e.GET("/authors", SelectAuthors) e.GET("/author/:id", SelectAuthor)  ////////// ここについての質問 e.Start(":8080") }

本題

go

1func SelectAuthor(c echo.Context) error { 2 var author ResponseAuthor 3 id := c.Param("id") 4 sess.Select("*").From(authortable).Where("id=?", id).Load(&author) 5 sess.Select("*").From(booktable).Where("author_id=?", id).Load(&author.Books) 6 return c.JSON(http.StatusOK, author) 7}

によって、

go

1{ 2 id: 2, 3 name: "Taro", 4 books: [ 5 { 6 id: 3, 7 author_id: 2, 8 name: "Taroの失敗" 9 } 10 ] 11} 12

時間はかかりましたが、上記みたく出力されるようになりました。
全Authorをこのように出力するにはどうすればいいかがわかりません。

{ authors: [ { id: 6, name: "Taro", books: null // ← ここを出力させたい!!!! }, { id: 7, name: "Tanaka", books: null //  ← ここを出力させたい!!!! }, { id: 8, name: "Masato", books: null //  ← ここを出力させたい!!!! } ] }

長いこと悩んでしまってるので、もしお力をお借りできたらと思っております。
よろしくお願いします。
現在の未完成のコードは下記に掲載します。

go

1func SelectAuthors(c echo.Context) error { 2 var authors ResponseAuthors 3 sess.Select("*").From(authortable).Load(&authors) 4 response := ResponseAuthors{ 5 Authors: nil, 6 } 7 return c.JSON(http.StatusOK, response) 8}

どうぞよろしくお願いします。

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

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

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

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

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

guest

回答1

0

  • 問題を整理(もう少し粒度を下げる)とよいと思います。今回だと、下記3つに整理できると思います
1.構造体(struct)を決める(今回だと’ResponseAuthors’を使えば良さそうですね) 2.joinしてselectした結果をstructに格納する 3.structの値をjsonに変換する ( 今回だと、’c.JSON(http.StatusOK, 【ResponseAuthors型の変数】’を使えば良さそうですね)
  • こうして整理すると、2の方法が分からない状態かと思います。

いろいろ方法はありますが、自分は純正databaseパッケージよりも、’sqlx’のライブラリが使いやすいと思うのでその例を挙げますね

2の参考:https://arata.hatenadiary.com/entry/2017/08/31/201940

  • また、フレームワークへの組み込みもひとつの要素ですので、うまくいかない場合はただのバッチとしてselectするようにすると問題が切り分けやすいと思います

echo + sqlxの例はこちら
https://qiita.com/zaru/items/0bee6c19b056dc72948d

作成した構造体のデバッグにはこちらが便利です
https://github.com/k0kubun/pp

投稿2018/09/18 23:18

編集2018/09/18 23:20
mats0228

総合スコア219

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問