新年初記事。
graphql-go/graphql
開発環境
> docker --version Docker version 20.10.8, build 3967b7d > docker-compose --version docker-compose version 1.29.2, build 5becea4c
作ったもの
以下のようなクエリを投げると、
query := ` { idols { id name age height birth_place birth_day blood_type } } `
以下のようなレスポンスを出力する。
2022/01/23 06:08:34 { "data": { "idols": [ { "age": 16, "birth_day": "4/25", "birth_place": "東京都", "blood_type": "A", "height": 155, "id": 1, "name": "櫻木 真乃" }, { "age": 16, "birth_day": "7/22", "birth_place": "アメリカ マサチューセッツ州", "blood_type": "O", "height": 157, "id": 2, "name": "八宮 めぐる" }, ... { "age": 20, "birth_day": "1/31", "birth_place": "神奈川県", "blood_type": "A", "height": 161, "id": 26, "name": "斑鳩 ルカ" } ] } }
クエリの引数の null 許容
クエリの引数の null 許容について、クエリの宣言時に意識する必要はなく、Resolver内で意識する必要がある。
例えば、以下のように使い分けたい時がある。
// age が20のフィールドのみを要求 { idols(age: 20) { id age name } } // 全件要求 { idols { id age name } }
クエリの引数の null 許容を使い分けたい時は、Resolverの中で場合分けをすればいいだけでスッキリ書ける。
scheme, err := graphql.NewSchema(graphql.SchemaConfig{ Query: graphql.NewObject(graphql.ObjectConfig{ Name: "Query", Fields: graphql.Fields{ "idols": &graphql.Field{ Type: graphql.NewList(IdolType), Resolve: func(p graphql.ResolveParams) (interface{}, error) { ageQuery, ok := p.Args["age"].(int) var option = Option{} // null の時に false が入る if ok { option.age = ageQuery } res := getSameAgeIdols(db, option) return res, nil; }, Args: graphql.FieldConfigArgument{ "age": &graphql.ArgumentConfig{ Type: graphql.Int, }, }, }, }, }), })
まとめ
- GraphQL、クエリ側でレスポンスの中身を柔軟に変更できるのが良い
- 今回はコードでスキーマを表現するタイプのライブラリを使ったが、スキーマ駆動で進められるライブラリ(99designs/gqlgen)も試してみたくなった
- graphql-go/graphql はスキーマの数が多くなるにつれて人間が書くコード量も増えるため辛そう
- 何か試す時は好きな題材でやるとモチベの維持が程よく出来てGood