N + 1 problem using "Dataloaders" of gqlgen which is a GraphQL library made by Golang. (If you google, an article will appear).
--I can write about Golang to some extent. ――It's not "GraphQL is what?" --I've done the initial setup with gqlgen's getting-started.
--The 11th "Correspondence to N + 1 problem using Dataloaders" --The 10th "GraphQL (gqlgen) Error Handling" ――The 9th "Certification authorization case in GraphQL (Auth0 RBAC tailoring)" --The 8th "GraphQL / Nuxt.js (TypeScript / Vuetify / Apollo) / Golang (gqlgen) / Google Cloud Storage combination video file upload implementation example ” ――The 7th "Paging implementation by Relay style in GraphQL (Part 2: Front end)" --The 6th "Paging implementation by Relay style in GraphQL (Part 1: Backend)" --The 5th "Start GraphQL server with DB connection (by Golang) on local machine Docker container" --The 4th "GraphQL Schema First for Front End with graphql-codegen" --Third "Create GraphQL server with go + gqlgen (DB connection using GORM)" --The 2nd "NuxtJS (with Apollo) TypeScript support" --Part 1 "Create a GraphQL service with a combination of" nuxtjs / apollo "on the front end and" go + gqlgen "on the back end"
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.5 LTS (Bionic Beaver)"
$ go version
go version go1.15.2 linux/amd64
v0.13.0
IDE - Goland
GoLand 2020.2.3
Build #GO-202.7319.61, built on September 16, 2020
https://github.com/sky0621/study-gqlgen/tree/v0.4/dataloaders
https://github.com/sky0621/study-gqlgen/tree/v0.5/dataloaders
For example, if you have the following GraphQL schema
schema.graphqls
type User {
id: ID!
name: String!
todos: [Todo]
}
type Todo {
id: ID!
task: String!
user: User!
}
type Query {
users: [User!]!
todos: [Todo!]!
}
A dedicated resolver shall be prepared for ʻuserof type
Todo and
todos of type ʻUser
.
(Because the logic can be used when preparing a query to get one or ʻuser` that matches one or the conditions in the future.)
user.go
type User struct {
ID int64 `json:"id"`
Name string `json:"name"`
}
todo.go
type Todo struct {
ID int64 `json:"id"`
Task string `json:"task"`
UserID int64 `json:"user_id" db:"user_id"`
}
One user has two tasks each
todo
tableFor the time being, generate a DB handler and start GraphQL server. DB uses SQLite.
main.go(Import statement omitted)
func main() {
http.Handle("/", playground.Handler("GraphQL playground", "/query"))
http.Handle("/query", handler.NewDefaultServer(
generated.NewExecutableSchema(
generated.Config{
Resolvers: &graph.Resolver{
DB: sqlx.MustOpen("sqlite3", "./data.db"),
},
},
),
))
log.Fatal(http.ListenAndServe(":8080", nil))
}
go:schema.resolvers.go
package graph
import (
"context"
"errors"
"fmt"
"log"
"github.com/sky0621/study-gqlgen/dataloaders/graph/generated"
"github.com/sky0621/study-gqlgen/dataloaders/graph/model"
)
// users: [User!]!Corresponds to
func (r *queryResolver) Users(ctx context.Context) ([]*model.User, error) {
~ ~ Explanation later ~ ~
}
// todos: [Todo!]!Corresponds to
func (r *queryResolver) Todos(ctx context.Context) ([]*model.Todo, error) {
~ ~ Explanation later ~ ~
}
//type User todos: [Todo]For acquisition
func (r *userResolver) Todos(ctx context.Context, obj *model.User) ([]*model.Todo, error) {
~ ~ Explanation later ~ ~
}
//type Todo user: User!For acquisition
func (r *todoResolver) User(ctx context.Context, obj *model.Todo) (*model.User, error) {
~ ~ Explanation later ~ ~
}
// Query returns generated.QueryResolver implementation.
func (r *Resolver) Query() generated.QueryResolver { return &queryResolver{r} }
// User returns generated.UserResolver implementation.
func (r *Resolver) User() generated.UserResolver { return &userResolver{r} }
// Todo returns generated.TodoResolver implementation.
func (r *Resolver) Todo() generated.TodoResolver { return &todoResolver{r} }
type queryResolver struct{ *Resolver }
type userResolver struct{ *Resolver }
type todoResolver struct{ *Resolver }
users: [User!]! Simply get all users.
func (r *queryResolver) Users(ctx context.Context) ([]*model.User, error) {
var users []*model.User
sql := "SELECT * FROM user"
log.Print(sql)
if err := r.DB.SelectContext(ctx, &users, sql); err != nil {
log.Print(err)
return nil, err
}
return users, nil
}
todos: [Todo!]! Simply get all the tasks.
func (r *queryResolver) Todos(ctx context.Context) ([]*model.Todo, error) {
var todos []*model.Todo
sql := "SELECT * FROM todo"
log.Print(sql)
if err := r.DB.SelectContext(ctx, &todos, sql); err != nil {
log.Print(err)
return nil, err
}
return todos, nil
}
1 Query that is additionally executed when the user's information is acquired. Since it is additionally executed for each user, that is, when the information of 5 users is acquired, the SQL is issued +5 times.
func (r *userResolver) Todos(ctx context.Context, obj *model.User) ([]*model.Todo, error) {
if obj == nil {
return []*model.Todo{}, nil
}
var todos []*model.Todo
sql := fmt.Sprintf("SELECT * FROM todo WHERE user_id = %d", obj.ID)
log.Print(sql)
if err := r.DB.SelectContext(ctx, &todos, sql); err != nil {
log.Print(err)
return nil, err
}
return todos, nil
}
Query that is additionally executed when 1ToDo information is acquired. Since it is additionally executed for each 1ToDo, that is, when 4ToDo information is acquired, SQL is issued +4 times.
func (r *todoResolver) User(ctx context.Context, obj *model.Todo) (*model.User, error) {
if obj == nil {
return nil, nil
}
var users []*model.User
sql := fmt.Sprintf("SELECT * FROM user WHERE id = %d", obj.UserID)
log.Print(sql)
if err := r.DB.SelectContext(ctx, &users, sql); err != nil {
log.Print(err)
return nil, err
}
if len(users) != 1 {
log.Print("users length is not 1")
return nil, errors.New("err")
}
return users[0], nil
}
Display results and query issuance count for each execution pattern of ʻusersquery and
todos` query in GraphQL
(no
todos` request)2020/10/22 00:07:01 SELECT * FROM user
(with
todos` request)query users {
users {
id
name
todos {
id
task
}
}
}
{ "data": { "users": [ { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] }, { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] }, { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] }, { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] }, { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } ] } }
2020/10/22 00:08:33 SELECT * FROM user
2020/10/22 00:08:33 SELECT * FROM todo WHERE user_id = 5
2020/10/22 00:08:33 SELECT * FROM todo WHERE user_id = 1
2020/10/22 00:08:33 SELECT * FROM todo WHERE user_id = 2
2020/10/22 00:08:33 SELECT * FROM todo WHERE user_id = 3
2020/10/22 00:08:33 SELECT * FROM todo WHERE user_id = 4
After acquiring all users, SQL to acquire ToDo is issued for each user. As a result, SQL is issued 6 times in total.
todos
(No request for ʻusers`)query todos {
todos {
id
task
}
}
{ "data": { "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" }, { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" }, { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" }, { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" }, { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }
2020/10/22 00:21:25 SELECT * FROM todo
todos
(with ʻusers` request)query todos {
todos {
id
task
user {
id
name
}
}
}
{ "data": { "todos": [ { "id": 1, "task": "What to do 1", "user": { "id": 1, "name": "Sato" } }, { "id": 2, "task": "What to do 2", "user": { "id": 1, "name": "Sato" } }, { "id": 3, "task": "What to do 3", "user": { "id": 1, "name": "Sato" } }, { "id": 4, "task": "What to do 4", "user": { "id": 1, "name": "Sato" } }, { "id": 5, "task": "What to do 5", "user": { "id": 2, "name": "Suzuki" } }, { "id": 6, "task": "What to do 6", "user": { "id": 2, "name": "Suzuki" } }, { "id": 7, "task": "What to do 7", "user": { "id": 2, "name": "Suzuki" } }, { "id": 8, "task": "What to do 8", "user": { "id": 2, "name": "Suzuki" } }, { "id": 9, "task": "What to do 9", "user": { "id": 3, "name": "Takahashi" } }, { "id": 10, "task": "To do 10", "user": { "id": 3, "name": "Takahashi" } }, { "id": 11, "task": "What to do 11", "user": { "id": 3, "name": "Takahashi" } }, { "id": 12, "task": "What to do 12", "user": { "id": 3, "name": "Takahashi" } }, { "id": 13, "task": "What to do 13", "user": { "id": 4, "name": "Tanaka" } }, { "id": 14, "task": "To do 14", "user": { "id": 4, "name": "Tanaka" } }, { "id": 15, "task": "To do 15", "user": { "id": 4, "name": "Tanaka" } }, { "id": 16, "task": "To do 16", "user": { "id": 4, "name": "Tanaka" } }, { "id": 17, "task": "What to do 17", "user": { "id": 5, "name": "Ito" } }, { "id": 18, "task": "What to do 18", "user": { "id": 5, "name": "Ito" } }, { "id": 19, "task": "What to do 19", "user": { "id": 5, "name": "Ito" } }, { "id": 20, "task": "To do 20", "user": { "id": 5, "name": "Ito" } } ] } }
2020/10/22 00:24:44 SELECT * FROM todo
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 5
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 3
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 1
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 1
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 1
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 1
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 2
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 2
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 2
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 2
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 4
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 3
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 3
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 3
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 4
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 5
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 4
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 5
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 4
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 5
After acquiring all ToDos, SQL to acquire users is issued for each ToDo. As a result, SQL is issued 21 times in total.
In this GraphQL schema, ToDo
and ʻUser` have a circular reference structure that refers to each other.
Therefore, if you want to do it, you can also send the following query.
query todos {
todos {
id
task
user {
id
name
todos {
id
task
user {
id
name
todos {
id
task
user {
id
name
todos {
id
task
}
}
}
}
}
}
}
}
{ "data": { "todos": [ { "id": 1, "task": "What to do 1", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 2, "task": "What to do 2", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 3, "task": "What to do 3", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 4, "task": "What to do 4", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } } ] } }, { "id": 2, "task": "What to do 2", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 2, "task": "What to do 2", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 3, "task": "What to do 3", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 4, "task": "What to do 4", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } } ] } }, { "id": 3, "task": "What to do 3", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 2, "task": "What to do 2", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 3, "task": "What to do 3", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 4, "task": "What to do 4", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } } ] } }, { "id": 4, "task": "What to do 4", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 2, "task": "What to do 2", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 3, "task": "What to do 3", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 4, "task": "What to do 4", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } } ] } } ] } }, { "id": 2, "task": "What to do 2", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 2, "task": "What to do 2", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 3, "task": "What to do 3", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 4, "task": "What to do 4", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } } ] } }, { "id": 2, "task": "What to do 2", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 2, "task": "What to do 2", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 3, "task": "What to do 3", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 4, "task": "What to do 4", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } } ] } }, { "id": 3, "task": "What to do 3", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 2, "task": "What to do 2", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 3, "task": "What to do 3", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 4, "task": "What to do 4", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } } ] } }, { "id": 4, "task": "What to do 4", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 2, "task": "What to do 2", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 3, "task": "What to do 3", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 4, "task": "What to do 4", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } } ] } } ] } }, { "id": 3, "task": "What to do 3", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 2, "task": "What to do 2", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 3, "task": "What to do 3", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 4, "task": "What to do 4", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } } ] } }, { "id": 2, "task": "What to do 2", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 2, "task": "What to do 2", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 3, "task": "What to do 3", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 4, "task": "What to do 4", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } } ] } }, { "id": 3, "task": "What to do 3", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 2, "task": "What to do 2", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 3, "task": "What to do 3", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 4, "task": "What to do 4", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } } ] } }, { "id": 4, "task": "What to do 4", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 2, "task": "What to do 2", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 3, "task": "What to do 3", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 4, "task": "What to do 4", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } } ] } } ] } }, { "id": 4, "task": "What to do 4", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 2, "task": "What to do 2", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 3, "task": "What to do 3", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 4, "task": "What to do 4", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } } ] } }, { "id": 2, "task": "What to do 2", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 2, "task": "What to do 2", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 3, "task": "What to do 3", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 4, "task": "What to do 4", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } } ] } }, { "id": 3, "task": "What to do 3", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 2, "task": "What to do 2", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 3, "task": "What to do 3", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 4, "task": "What to do 4", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } } ] } }, { "id": 4, "task": "What to do 4", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 2, "task": "What to do 2", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 3, "task": "What to do 3", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } }, { "id": 4, "task": "What to do 4", "user": { "id": 1, "name": "Sato", "todos": [ { "id": 1, "task": "What to do 1" }, { "id": 2, "task": "What to do 2" }, { "id": 3, "task": "To do 3" }, { "id": 4, "task": "What to do 4" } ] } } ] } } ] } }, { "id": 5, "task": "What to do 5", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 6, "task": "What to do 6", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 7, "task": "What to do 7", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 8, "task": "What to do 8", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } } ] } }, { "id": 6, "task": "What to do 6", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 6, "task": "What to do 6", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 7, "task": "What to do 7", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 8, "task": "What to do 8", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } } ] } }, { "id": 7, "task": "What to do 7", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 6, "task": "What to do 6", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 7, "task": "What to do 7", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 8, "task": "What to do 8", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } } ] } }, { "id": 8, "task": "What to do 8", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 6, "task": "What to do 6", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 7, "task": "What to do 7", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 8, "task": "What to do 8", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } } ] } } ] } }, { "id": 6, "task": "What to do 6", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 6, "task": "What to do 6", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 7, "task": "What to do 7", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 8, "task": "What to do 8", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } } ] } }, { "id": 6, "task": "What to do 6", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 6, "task": "What to do 6", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 7, "task": "What to do 7", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 8, "task": "What to do 8", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } } ] } }, { "id": 7, "task": "What to do 7", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 6, "task": "What to do 6", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 7, "task": "What to do 7", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 8, "task": "What to do 8", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } } ] } }, { "id": 8, "task": "What to do 8", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 6, "task": "What to do 6", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 7, "task": "What to do 7", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 8, "task": "What to do 8", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } } ] } } ] } }, { "id": 7, "task": "What to do 7", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 6, "task": "What to do 6", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 7, "task": "What to do 7", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 8, "task": "What to do 8", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } } ] } }, { "id": 6, "task": "What to do 6", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 6, "task": "What to do 6", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 7, "task": "What to do 7", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 8, "task": "What to do 8", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } } ] } }, { "id": 7, "task": "What to do 7", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 6, "task": "What to do 6", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 7, "task": "What to do 7", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 8, "task": "What to do 8", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } } ] } }, { "id": 8, "task": "What to do 8", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 6, "task": "What to do 6", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 7, "task": "What to do 7", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 8, "task": "What to do 8", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } } ] } } ] } }, { "id": 8, "task": "What to do 8", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 6, "task": "What to do 6", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 7, "task": "What to do 7", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 8, "task": "What to do 8", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } } ] } }, { "id": 6, "task": "What to do 6", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 6, "task": "What to do 6", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 7, "task": "What to do 7", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 8, "task": "What to do 8", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } } ] } }, { "id": 7, "task": "What to do 7", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 6, "task": "What to do 6", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 7, "task": "What to do 7", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 8, "task": "What to do 8", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } } ] } }, { "id": 8, "task": "What to do 8", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 6, "task": "What to do 6", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 7, "task": "What to do 7", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } }, { "id": 8, "task": "What to do 8", "user": { "id": 2, "name": "Suzuki", "todos": [ { "id": 5, "task": "What to do 5" }, { "id": 6, "task": "What to do 6" }, { "id": 7, "task": "What to do 7" }, { "id": 8, "task": "To do 8" } ] } } ] } } ] } }, { "id": 9, "task": "What to do 9", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 10, "task": "To do 10", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 11, "task": "What to do 11", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 12, "task": "What to do 12", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } } ] } }, { "id": 10, "task": "To do 10", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 10, "task": "To do 10", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 11, "task": "What to do 11", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 12, "task": "What to do 12", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } } ] } }, { "id": 11, "task": "What to do 11", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 10, "task": "To do 10", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 11, "task": "What to do 11", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 12, "task": "What to do 12", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } } ] } }, { "id": 12, "task": "What to do 12", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 10, "task": "To do 10", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 11, "task": "What to do 11", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 12, "task": "What to do 12", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } } ] } } ] } }, { "id": 10, "task": "To do 10", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 10, "task": "To do 10", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 11, "task": "What to do 11", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 12, "task": "What to do 12", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } } ] } }, { "id": 10, "task": "To do 10", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 10, "task": "To do 10", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 11, "task": "What to do 11", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 12, "task": "What to do 12", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } } ] } }, { "id": 11, "task": "What to do 11", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 10, "task": "To do 10", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 11, "task": "What to do 11", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 12, "task": "What to do 12", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } } ] } }, { "id": 12, "task": "What to do 12", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 10, "task": "To do 10", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 11, "task": "What to do 11", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 12, "task": "What to do 12", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } } ] } } ] } }, { "id": 11, "task": "What to do 11", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 10, "task": "To do 10", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 11, "task": "What to do 11", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 12, "task": "What to do 12", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } } ] } }, { "id": 10, "task": "To do 10", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 10, "task": "To do 10", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 11, "task": "What to do 11", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 12, "task": "What to do 12", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } } ] } }, { "id": 11, "task": "What to do 11", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 10, "task": "To do 10", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 11, "task": "What to do 11", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 12, "task": "What to do 12", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } } ] } }, { "id": 12, "task": "What to do 12", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 10, "task": "To do 10", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 11, "task": "What to do 11", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 12, "task": "What to do 12", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } } ] } } ] } }, { "id": 12, "task": "What to do 12", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 10, "task": "To do 10", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 11, "task": "What to do 11", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 12, "task": "What to do 12", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } } ] } }, { "id": 10, "task": "To do 10", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 10, "task": "To do 10", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 11, "task": "What to do 11", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 12, "task": "What to do 12", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } } ] } }, { "id": 11, "task": "What to do 11", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 10, "task": "To do 10", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 11, "task": "What to do 11", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 12, "task": "What to do 12", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } } ] } }, { "id": 12, "task": "What to do 12", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 10, "task": "To do 10", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 11, "task": "What to do 11", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } }, { "id": 12, "task": "What to do 12", "user": { "id": 3, "name": "Takahashi", "todos": [ { "id": 9, "task": "What to do 9" }, { "id": 10, "task": "To do 10" }, { "id": 11, "task": "What to do 11" }, { "id": 12, "task": "To do 12" } ] } } ] } } ] } }, { "id": 13, "task": "What to do 13", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 14, "task": "To do 14", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 15, "task": "To do 15", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 16, "task": "To do 16", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } } ] } }, { "id": 14, "task": "To do 14", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 14, "task": "To do 14", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 15, "task": "To do 15", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 16, "task": "To do 16", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } } ] } }, { "id": 15, "task": "To do 15", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 14, "task": "To do 14", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 15, "task": "To do 15", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 16, "task": "To do 16", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } } ] } }, { "id": 16, "task": "To do 16", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 14, "task": "To do 14", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 15, "task": "To do 15", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 16, "task": "To do 16", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } } ] } } ] } }, { "id": 14, "task": "To do 14", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 14, "task": "To do 14", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 15, "task": "To do 15", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 16, "task": "To do 16", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } } ] } }, { "id": 14, "task": "To do 14", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 14, "task": "To do 14", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 15, "task": "To do 15", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 16, "task": "To do 16", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } } ] } }, { "id": 15, "task": "To do 15", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 14, "task": "To do 14", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 15, "task": "To do 15", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 16, "task": "To do 16", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } } ] } }, { "id": 16, "task": "To do 16", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 14, "task": "To do 14", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 15, "task": "To do 15", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 16, "task": "To do 16", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } } ] } } ] } }, { "id": 15, "task": "To do 15", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 14, "task": "To do 14", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 15, "task": "To do 15", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 16, "task": "To do 16", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } } ] } }, { "id": 14, "task": "To do 14", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 14, "task": "To do 14", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 15, "task": "To do 15", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 16, "task": "To do 16", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } } ] } }, { "id": 15, "task": "To do 15", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 14, "task": "To do 14", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 15, "task": "To do 15", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 16, "task": "To do 16", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } } ] } }, { "id": 16, "task": "To do 16", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 14, "task": "To do 14", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 15, "task": "To do 15", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 16, "task": "To do 16", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } } ] } } ] } }, { "id": 16, "task": "To do 16", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 14, "task": "To do 14", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 15, "task": "To do 15", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 16, "task": "To do 16", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } } ] } }, { "id": 14, "task": "To do 14", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 14, "task": "To do 14", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 15, "task": "To do 15", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 16, "task": "To do 16", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } } ] } }, { "id": 15, "task": "To do 15", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 14, "task": "To do 14", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 15, "task": "To do 15", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 16, "task": "To do 16", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } } ] } }, { "id": 16, "task": "To do 16", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 14, "task": "To do 14", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 15, "task": "To do 15", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } }, { "id": 16, "task": "To do 16", "user": { "id": 4, "name": "Tanaka", "todos": [ { "id": 13, "task": "What to do 13" }, { "id": 14, "task": "To do 14" }, { "id": 15, "task": "To do 15" }, { "id": 16, "task": "To do 16" } ] } } ] } } ] } }, { "id": 17, "task": "What to do 17", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 18, "task": "What to do 18", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 19, "task": "What to do 19", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 20, "task": "To do 20", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } } ] } }, { "id": 18, "task": "What to do 18", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 18, "task": "What to do 18", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 19, "task": "What to do 19", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 20, "task": "To do 20", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } } ] } }, { "id": 19, "task": "What to do 19", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 18, "task": "What to do 18", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 19, "task": "What to do 19", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 20, "task": "To do 20", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } } ] } }, { "id": 20, "task": "To do 20", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 18, "task": "What to do 18", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 19, "task": "What to do 19", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 20, "task": "To do 20", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } } ] } } ] } }, { "id": 18, "task": "What to do 18", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 18, "task": "What to do 18", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 19, "task": "What to do 19", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 20, "task": "To do 20", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } } ] } }, { "id": 18, "task": "What to do 18", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 18, "task": "What to do 18", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 19, "task": "What to do 19", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 20, "task": "To do 20", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } } ] } }, { "id": 19, "task": "What to do 19", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 18, "task": "What to do 18", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 19, "task": "What to do 19", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 20, "task": "To do 20", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } } ] } }, { "id": 20, "task": "To do 20", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 18, "task": "What to do 18", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 19, "task": "What to do 19", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 20, "task": "To do 20", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } } ] } } ] } }, { "id": 19, "task": "What to do 19", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 18, "task": "What to do 18", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 19, "task": "What to do 19", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 20, "task": "To do 20", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } } ] } }, { "id": 18, "task": "What to do 18", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 18, "task": "What to do 18", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 19, "task": "What to do 19", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 20, "task": "To do 20", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } } ] } }, { "id": 19, "task": "What to do 19", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 18, "task": "What to do 18", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 19, "task": "What to do 19", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 20, "task": "To do 20", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } } ] } }, { "id": 20, "task": "To do 20", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 18, "task": "What to do 18", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 19, "task": "What to do 19", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 20, "task": "To do 20", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } } ] } } ] } }, { "id": 20, "task": "To do 20", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 18, "task": "What to do 18", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 19, "task": "What to do 19", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 20, "task": "To do 20", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } } ] } }, { "id": 18, "task": "What to do 18", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 18, "task": "What to do 18", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 19, "task": "What to do 19", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 20, "task": "To do 20", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } } ] } }, { "id": 19, "task": "What to do 19", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 18, "task": "What to do 18", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 19, "task": "What to do 19", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 20, "task": "To do 20", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } } ] } }, { "id": 20, "task": "To do 20", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 18, "task": "What to do 18", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 19, "task": "What to do 19", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } }, { "id": 20, "task": "To do 20", "user": { "id": 5, "name": "Ito", "todos": [ { "id": 17, "task": "What to do 17" }, { "id": 18, "task": "What to do 18" }, { "id": 19, "task": "To do 19" }, { "id": 20, "task": "To do 20" } ] } } ] } } ] } } ] } }
2020/10/22 00:34:57 SELECT * FROM todo 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 2 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 1 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM user WHERE id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 5 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 3 2020/10/22 00:34:57 SELECT * FROM todo WHERE user_id = 4
In this way, if you freely define the schema without thinking about anything and make it a simple SQL issue in consideration of versatility, as a result, a huge number of SQL issues will be issued.
Regarding the last circular reference structure, if the client is open to the public, Frank will be attacked by DOS if no restrictions are applied, but the countermeasures will be described later.
First, consider measures to reduce the number of SQL issuances.
Simply put, all you have to do is prepare tuned SQL for each resolver.
In other words
Resolver for type User todos: [Todo]
Without preparing a resolver for type Todo user: User!
(r *queryResolver) Users(ctx context.Context) ([]*model.User, error)
(r *queryResolver) Todos(ctx context.Context) ([]*model.Todo, error)
It means that SQL should be generated each time according to the contents loaded in the request.
However,
If you take such a measure, you will end up preparing complicated SQL generation logic to respond to the extremely flexible GraphQL query request.
I want to keep SQL simple if possible.
That's why Dataloaders will appear.
Basically, the source is automatically generated according to the following. https://gqlgen.com/reference/dataloaders/#dataloader
Well, it's written in ↑,
go get github.com/vektah/dataloaden
Get dataloaden
with, and with the path you want to automatically generate the source (for example,study-gqlgen / dataloaders / graph /
this time),
go run github.com/vektah/dataloaden UserLoader int *github.com/sky0621/study-gqlgen/dataloaders/graph/model.User
When
go run github.com/vektah/dataloaden TodoLoader int64 []*github.com/sky0621/study-gqlgen/dataloaders/graph/model.Todo
And. The ʻint in the middle is the type of the key element that uniquely identifies ʻuser
and todo
.
In this case, both the ʻuser table and the
todo table have PK set to ʻinteger
, so set it to ʻint`.
If PK is a string like UUID,
go run github.com/vektah/dataloaden UserLoader string *github.com/sky0621/study-gqlgen/dataloaders/graph/model.User
You can do it.
Also, regarding the type to be generated, model.User
is just a pointer, and model.Todo
is sliced.
This is because each usage is different as follows.
model.User
After multiple todo
s are acquired by the todos
resolver, the resolver ((r * todoResolver) User (~~)
) that acquires the user associated with each ToDo is called, and it is used there.
There, it is only necessary to get one user associated with 1ToDo, so prepare a dataloader that returns with just a pointer.
model.Todo
After multiple ʻusers are acquired by the ʻusers
resolver, a resolver ((r * userResolver) Todos (~~)
) that acquires the ToDos associated with each user is called, and it is used there.
Since multiple tasks associated with one user are acquired there, prepare a dataloader that returns in slices.
The source automatically generated by the above dataloaden
command is as follows.
userloader_gen.go
// Code generated by github.com/vektah/dataloaden, DO NOT EDIT.
package graph
import (
"sync"
"time"
"github.com/sky0621/study-gqlgen/dataloaders/graph/model"
)
// UserLoaderConfig captures the config to create a new UserLoader
type UserLoaderConfig struct {
// Fetch is a method that provides the data for the loader
Fetch func(keys []int) ([]*model.User, []error)
// Wait is how long wait before sending a batch
Wait time.Duration
// MaxBatch will limit the maximum number of keys to send in one batch, 0 = not limit
MaxBatch int
}
// NewUserLoader creates a new UserLoader given a fetch, wait, and maxBatch
func NewUserLoader(config UserLoaderConfig) *UserLoader {
return &UserLoader{
fetch: config.Fetch,
wait: config.Wait,
maxBatch: config.MaxBatch,
}
}
// UserLoader batches and caches requests
type UserLoader struct {
// this method provides the data for the loader
fetch func(keys []int) ([]*model.User, []error)
// how long to done before sending a batch
wait time.Duration
// this will limit the maximum number of keys to send in one batch, 0 = no limit
maxBatch int
// INTERNAL
// lazily created cache
cache map[int]*model.User
// the current batch. keys will continue to be collected until timeout is hit,
// then everything will be sent to the fetch method and out to the listeners
batch *userLoaderBatch
// mutex to prevent races
mu sync.Mutex
}
type userLoaderBatch struct {
keys []int
data []*model.User
error []error
closing bool
done chan struct{}
}
// Load a User by key, batching and caching will be applied automatically
func (l *UserLoader) Load(key int) (*model.User, error) {
return l.LoadThunk(key)()
}
// LoadThunk returns a function that when called will block waiting for a User.
// This method should be used if you want one goroutine to make requests to many
// different data loaders without blocking until the thunk is called.
func (l *UserLoader) LoadThunk(key int) func() (*model.User, error) {
l.mu.Lock()
if it, ok := l.cache[key]; ok {
l.mu.Unlock()
return func() (*model.User, error) {
return it, nil
}
}
if l.batch == nil {
l.batch = &userLoaderBatch{done: make(chan struct{})}
}
batch := l.batch
pos := batch.keyIndex(l, key)
l.mu.Unlock()
return func() (*model.User, error) {
<-batch.done
var data *model.User
if pos < len(batch.data) {
data = batch.data[pos]
}
var err error
// its convenient to be able to return a single error for everything
if len(batch.error) == 1 {
err = batch.error[0]
} else if batch.error != nil {
err = batch.error[pos]
}
if err == nil {
l.mu.Lock()
l.unsafeSet(key, data)
l.mu.Unlock()
}
return data, err
}
}
// LoadAll fetches many keys at once. It will be broken into appropriate sized
// sub batches depending on how the loader is configured
func (l *UserLoader) LoadAll(keys []int) ([]*model.User, []error) {
results := make([]func() (*model.User, error), len(keys))
for i, key := range keys {
results[i] = l.LoadThunk(key)
}
users := make([]*model.User, len(keys))
errors := make([]error, len(keys))
for i, thunk := range results {
users[i], errors[i] = thunk()
}
return users, errors
}
// LoadAllThunk returns a function that when called will block waiting for a Users.
// This method should be used if you want one goroutine to make requests to many
// different data loaders without blocking until the thunk is called.
func (l *UserLoader) LoadAllThunk(keys []int) func() ([]*model.User, []error) {
results := make([]func() (*model.User, error), len(keys))
for i, key := range keys {
results[i] = l.LoadThunk(key)
}
return func() ([]*model.User, []error) {
users := make([]*model.User, len(keys))
errors := make([]error, len(keys))
for i, thunk := range results {
users[i], errors[i] = thunk()
}
return users, errors
}
}
// Prime the cache with the provided key and value. If the key already exists, no change is made
// and false is returned.
// (To forcefully prime the cache, clear the key first with loader.clear(key).prime(key, value).)
func (l *UserLoader) Prime(key int, value *model.User) bool {
l.mu.Lock()
var found bool
if _, found = l.cache[key]; !found {
// make a copy when writing to the cache, its easy to pass a pointer in from a loop var
// and end up with the whole cache pointing to the same value.
cpy := *value
l.unsafeSet(key, &cpy)
}
l.mu.Unlock()
return !found
}
// Clear the value at key from the cache, if it exists
func (l *UserLoader) Clear(key int) {
l.mu.Lock()
delete(l.cache, key)
l.mu.Unlock()
}
func (l *UserLoader) unsafeSet(key int, value *model.User) {
if l.cache == nil {
l.cache = map[int]*model.User{}
}
l.cache[key] = value
}
// keyIndex will return the location of the key in the batch, if its not found
// it will add the key to the batch
func (b *userLoaderBatch) keyIndex(l *UserLoader, key int) int {
for i, existingKey := range b.keys {
if key == existingKey {
return i
}
}
pos := len(b.keys)
b.keys = append(b.keys, key)
if pos == 0 {
go b.startTimer(l)
}
if l.maxBatch != 0 && pos >= l.maxBatch-1 {
if !b.closing {
b.closing = true
l.batch = nil
go b.end(l)
}
}
return pos
}
func (b *userLoaderBatch) startTimer(l *UserLoader) {
time.Sleep(l.wait)
l.mu.Lock()
// we must have hit a batch limit and are already finalizing this batch
if b.closing {
l.mu.Unlock()
return
}
l.batch = nil
l.mu.Unlock()
b.end(l)
}
func (b *userLoaderBatch) end(l *UserLoader) {
b.data, b.error = l.fetch(b.keys)
close(b.done)
}
todoloader_gen.go
// Code generated by github.com/vektah/dataloaden, DO NOT EDIT.
package graph
import (
"sync"
"time"
"github.com/sky0621/study-gqlgen/dataloaders/graph/model"
)
// TodoLoaderConfig captures the config to create a new TodoLoader
type TodoLoaderConfig struct {
// Fetch is a method that provides the data for the loader
Fetch func(keys []int64) ([][]*model.Todo, []error)
// Wait is how long wait before sending a batch
Wait time.Duration
// MaxBatch will limit the maximum number of keys to send in one batch, 0 = not limit
MaxBatch int
}
// NewTodoLoader creates a new TodoLoader given a fetch, wait, and maxBatch
func NewTodoLoader(config TodoLoaderConfig) *TodoLoader {
return &TodoLoader{
fetch: config.Fetch,
wait: config.Wait,
maxBatch: config.MaxBatch,
}
}
// TodoLoader batches and caches requests
type TodoLoader struct {
// this method provides the data for the loader
fetch func(keys []int64) ([][]*model.Todo, []error)
// how long to done before sending a batch
wait time.Duration
// this will limit the maximum number of keys to send in one batch, 0 = no limit
maxBatch int
// INTERNAL
// lazily created cache
cache map[int64][]*model.Todo
// the current batch. keys will continue to be collected until timeout is hit,
// then everything will be sent to the fetch method and out to the listeners
batch *todoLoaderBatch
// mutex to prevent races
mu sync.Mutex
}
type todoLoaderBatch struct {
keys []int64
data [][]*model.Todo
error []error
closing bool
done chan struct{}
}
// Load a Todo by key, batching and caching will be applied automatically
func (l *TodoLoader) Load(key int64) ([]*model.Todo, error) {
return l.LoadThunk(key)()
}
// LoadThunk returns a function that when called will block waiting for a Todo.
// This method should be used if you want one goroutine to make requests to many
// different data loaders without blocking until the thunk is called.
func (l *TodoLoader) LoadThunk(key int64) func() ([]*model.Todo, error) {
l.mu.Lock()
if it, ok := l.cache[key]; ok {
l.mu.Unlock()
return func() ([]*model.Todo, error) {
return it, nil
}
}
if l.batch == nil {
l.batch = &todoLoaderBatch{done: make(chan struct{})}
}
batch := l.batch
pos := batch.keyIndex(l, key)
l.mu.Unlock()
return func() ([]*model.Todo, error) {
<-batch.done
var data []*model.Todo
if pos < len(batch.data) {
data = batch.data[pos]
}
var err error
// its convenient to be able to return a single error for everything
if len(batch.error) == 1 {
err = batch.error[0]
} else if batch.error != nil {
err = batch.error[pos]
}
if err == nil {
l.mu.Lock()
l.unsafeSet(key, data)
l.mu.Unlock()
}
return data, err
}
}
// LoadAll fetches many keys at once. It will be broken into appropriate sized
// sub batches depending on how the loader is configured
func (l *TodoLoader) LoadAll(keys []int64) ([][]*model.Todo, []error) {
results := make([]func() ([]*model.Todo, error), len(keys))
for i, key := range keys {
results[i] = l.LoadThunk(key)
}
todos := make([][]*model.Todo, len(keys))
errors := make([]error, len(keys))
for i, thunk := range results {
todos[i], errors[i] = thunk()
}
return todos, errors
}
// LoadAllThunk returns a function that when called will block waiting for a Todos.
// This method should be used if you want one goroutine to make requests to many
// different data loaders without blocking until the thunk is called.
func (l *TodoLoader) LoadAllThunk(keys []int64) func() ([][]*model.Todo, []error) {
results := make([]func() ([]*model.Todo, error), len(keys))
for i, key := range keys {
results[i] = l.LoadThunk(key)
}
return func() ([][]*model.Todo, []error) {
todos := make([][]*model.Todo, len(keys))
errors := make([]error, len(keys))
for i, thunk := range results {
todos[i], errors[i] = thunk()
}
return todos, errors
}
}
// Prime the cache with the provided key and value. If the key already exists, no change is made
// and false is returned.
// (To forcefully prime the cache, clear the key first with loader.clear(key).prime(key, value).)
func (l *TodoLoader) Prime(key int64, value []*model.Todo) bool {
l.mu.Lock()
var found bool
if _, found = l.cache[key]; !found {
// make a copy when writing to the cache, its easy to pass a pointer in from a loop var
// and end up with the whole cache pointing to the same value.
cpy := make([]*model.Todo, len(value))
copy(cpy, value)
l.unsafeSet(key, cpy)
}
l.mu.Unlock()
return !found
}
// Clear the value at key from the cache, if it exists
func (l *TodoLoader) Clear(key int64) {
l.mu.Lock()
delete(l.cache, key)
l.mu.Unlock()
}
func (l *TodoLoader) unsafeSet(key int64, value []*model.Todo) {
if l.cache == nil {
l.cache = map[int64][]*model.Todo{}
}
l.cache[key] = value
}
// keyIndex will return the location of the key in the batch, if its not found
// it will add the key to the batch
func (b *todoLoaderBatch) keyIndex(l *TodoLoader, key int64) int {
for i, existingKey := range b.keys {
if key == existingKey {
return i
}
}
pos := len(b.keys)
b.keys = append(b.keys, key)
if pos == 0 {
go b.startTimer(l)
}
if l.maxBatch != 0 && pos >= l.maxBatch-1 {
if !b.closing {
b.closing = true
l.batch = nil
go b.end(l)
}
}
return pos
}
func (b *todoLoaderBatch) startTimer(l *TodoLoader) {
time.Sleep(l.wait)
l.mu.Lock()
// we must have hit a batch limit and are already finalizing this batch
if b.closing {
l.mu.Unlock()
return
}
l.batch = nil
l.mu.Unlock()
b.end(l)
}
func (b *todoLoaderBatch) end(l *TodoLoader) {
b.data, b.error = l.fetch(b.keys)
close(b.done)
}
The theory is as follows. For example, when acquiring all tasks including user information, the following SQL was issued for each request.
2020/10/22 00:24:44 SELECT * FROM todo
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 5
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 3
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 1
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 1
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 1
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 1
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 2
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 2
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 2
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 2
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 4
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 3
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 3
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 3
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 4
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 5
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 4
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 5
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 4
2020/10/22 00:24:44 SELECT * FROM user WHERE id = 5
On the other hand, in the dataloader, while receiving one request and firing various resolvers, it waits for a certain period of time (or until a certain number of search IDs are accumulated).
As a result, what used to be WHERE id = 1
etc. and had to issue SQL multiple times is set toWHERE id IN (1, 2, 3, ..)
once (2 depending on the number of cases). ~ N times).
To achieve the above, define middleware that hooks the HTTP request scope, and issue an id summary type SQL statement while using the function of the automatically generated source in it.
server.go(package,Import statement omitted)
func main() {
db := sqlx.MustOpen("sqlite3", "./data.db")
http.Handle("/", playground.Handler("GraphQL playground", "/query"))
http.Handle("/query", graph.Middleware( <--add to!
db,
handler.NewDefaultServer(
generated.NewExecutableSchema(
generated.Config{
Resolvers: &graph.Resolver{
DB: db,
},
},
),
)),
)
log.Fatal(http.ListenAndServe(":8080", nil))
}
Wrap the handler with graph.Middleware (~~)
.
There is no detailed explanation because the writing traces the source described below. https://gqlgen.com/reference/dataloaders/#dataloader
As a result, the SQL issue defined by the fetch function in ʻUserLoader and
TodoLoader` can be called when waiting for a maximum of 1 millisecond or when a maximum of 100 ids are accumulated.
graph/dataloaders.go
package graph
import (
"context"
"log"
"net/http"
"strconv"
"strings"
"time"
"github.com/jmoiron/sqlx"
"github.com/sky0621/study-gqlgen/dataloaders/graph/model"
)
const loadersKey = "dataLoaders"
type Loaders struct {
UsersByIDs UserLoader
TodosByUserIDs TodoLoader
}
func Middleware(conn *sqlx.DB, next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
ctx := context.WithValue(r.Context(), loadersKey, &Loaders{
UsersByIDs: UserLoader{
maxBatch: 100,
wait: 1 * time.Millisecond,
//As a result of waiting for up to 1 millisecond, or a slice of id for up to 100 GraphQL queries is passed under the name ids.
fetch: func(ids []int64) ([]*model.User, []error) {
if len(ids) == 0 {
return nil, nil
}
sql := "SELECT * FROM user WHERE id IN (" + toPKs(ids) + ")"
log.Print(sql)
var users []*model.User
if err := conn.SelectContext(r.Context(), &users, sql); err != nil {
log.Print(err)
return nil, []error{err}
}
//You need to map the data for each id in ids.
userById := map[int64]*model.User{}
for _, user := range users {
userById[user.ID] = user
}
results := make([]*model.User, len(ids))
for i, id := range ids {
results[i] = userById[id]
}
return results, nil
},
},
TodosByUserIDs: TodoLoader{
maxBatch: 100,
wait: 1 * time.Millisecond,
//As a result of waiting for up to 1 millisecond, or a slice of id for up to 100 GraphQL queries is passed under the name ids.
fetch: func(userIDs []int64) ([][]*model.Todo, []error) {
if len(userIDs) == 0 {
return nil, nil
}
sql := "SELECT * FROM todo WHERE user_id IN (" + toPKs(userIDs) + ")"
log.Print(sql)
var todos []*model.Todo
if err := conn.SelectContext(r.Context(), &todos, sql); err != nil {
log.Print(err)
return nil, []error{err}
}
//You need to map the data for each id in ids.
todoByUserId := map[int64][]*model.Todo{}
for _, todo := range todos {
todoByUserId[todo.UserID] = append(todoByUserId[todo.UserID], todo)
}
results := make([][]*model.Todo, len(userIDs))
for i, id := range userIDs {
results[i] = todoByUserId[id]
}
return results, nil
},
},
})
r = r.WithContext(ctx)
next.ServeHTTP(w, r)
})
}
func For(ctx context.Context) *Loaders {
return ctx.Value(loadersKey).(*Loaders)
}
func toPKs(ids []int64) string {
//Convert ids to a form that can be specified in the IN clause of a SQL statement
var pks []string
for _, id := range ids {
pks = append(pks, strconv.FormatInt(id, 10))
}
return strings.Join(pks, ",")
}
Before using dataloader, SQL issue for ToDo acquisition for each user was written in each of the following functions, but SQL issue for user acquisition for each ToDo was written, but since the logic was sent to the dataloader side, the inside of the resolver is simple as follows. become.
go:graph/schema.resolvers.go(Excerpt only for the parts that are different from before using dataloader)
func (r *userResolver) Todos(ctx context.Context, obj *model.User) ([]*model.Todo, error) {
if obj == nil {
return []*model.Todo{}, nil
}
return For(ctx).TodosByUserIDs.Load(obj.ID)
}
func (r *todoResolver) User(ctx context.Context, obj *model.Todo) (*model.User, error) {
if obj == nil {
return nil, nil
}
return For(ctx).UsersByIDs.Load(obj.UserID)
}
The query and result are the same as before using dataloader, so only the SQL issuance result. In this case, no matter how many tasks and users increase, the number of SQL issues will not increase accordingly.
(with
todos` request)2020/10/23 02:33:03 SELECT * FROM user
2020/10/23 02:33:03 SELECT * FROM todo WHERE user_id IN (5,1,3,4,2)
to dos
(with ʻusers` request)2020/10/23 02:33:59 SELECT * FROM todo
2020/10/23 02:33:59 SELECT * FROM user WHERE id IN (5,1,2,3,4)
In the first place, it is impossible to issue SQL for each parent information to acquire linked information and child hierarchy information, but it seems that such an N + 1 problem has been around for a long time. Most of the time, the frameworks that are often used in the language you use provide solutions as libraries, so you may not be aware of it.
By the way, if you get used to the automatic generation by Dataloader, it will not be a problem, but what to do with the key type (although the important part is automatic generation) and whether the return value of the function is a pointer At first, there is a lot of confusion because you have to decide how to use it, such as whether to slice it.
I've exhausted my efforts to hit as many complex queries as possible due to circular references in the schema structure, so I'll take another opportunity.
Recommended Posts