Best practice or idead to get nested return JSON from the query result

I’ve cases that return a nested json. sample

type Post struct{
  ID int json:"id"
  Title string json:"title"
  Author Author json:"author"
  Comment []Comment json:"comment"
}
type Author struct {
  ID int json:"id"
  Name string json:"name"
}
type Comment struct {
  ID int json:"id"
  Text string json:"text"
}

and the return should be

{
  "total_result" : 50,
  "current_page" : 1,
  "posts" : [
   {
    "title" : "title 1",
    "author" : [
         "name" : "author 1",
      ],
      "comment" : [
         {"text" : "commentary 1.1"}, {"text" : "commentary 1.2"}, ....
       ]
   },
   {
    "title" : "title 2",
    "author" : [
         "name" : "author 2",
      ],
      "comment" : [
        {"text" : "commentary 2.1"}, {"text" : "commentary 2.2"}, ....
      ]
   }
  ]
}

my question is, is this a good idea to execute a query like this :

query := "query that gets the post data with limit and offset of course"
rows, err := db.QueryContext(ctx, query)
//handle error
var record []Post
for rows.Next(){
  var post Post
  if err := rows.Scan(&post....) {..}
  record = append(record, post)
}

then, I do for-loop to get the author

for i := 0; i < len(record); i++ {
    var author Author
   query = "select id,name from authors where id=$1"
   rows, err :=  db.QueryContext(ctx, query, record[i].Id)
  //handel error
   //scan data to author
   record[i].Author.Id = author.Id
   record[i].Author.Name = author.Name
}

same process to get comments if the post has comments.

but, I’m just thinking about how can I do with just 1 process to get the Author and the Comments. it’s like while I scan the first query (select posts query) and then I do looping inside of
for rows.Next()
post scan process, but I got fail because the first query should be rows.Close(). but when I do that, the Scan process can’t process because the connection is over.

Thanks in advance everyone

This topic was automatically closed 90 days after the last reply. New replies are no longer allowed.