平日に1.5Lペットボトルを1.5本弱ペースで飲むので、2週間で2箱 (12本) がいちばん近いか? 定期おトク便の周期を合わせるまでが大変で、家に大量のコーラがある暮らしが続いていた。今はちょっと足りないかもしれない。
ここで一句
五月雨を utf8mb4
— うたがわきき (@utgwkk) 2022年4月19日
grapheneでナイーブなnodesクエリを実装する
複数のIDを指定してデータを一括で取得したい場合があって、手作りした。ナイーブにはこういう感じでいける。N+1クエリになるのでもうちょっとうまくやる必要がありそう。
import graphene class Query(ObjectType): # 中略 nodes = graphene.Field( graphene.NonNull(graphene.List(relay.Node)), ids=graphene.List( graphene.NonNull(graphene.ID), required=True, description="The IDs of the object", ), ) def resolve_nodes(root, info, **args): ids = args["ids"] return [graphene.relay.Node.node_resolver(None, root, info, id) for id in ids]
こういう実装をしたら以下のようなGraphQLスキーマになる。
type Query { # 中略 nodes( """The IDs of the object""" ids: [ID!]! ): [Node]! }
GoでGraphQLクライアントを書くために github.com/hasura/go-graphql-client を使ったら便利だった
あらすじ
Go言語でGraphQL APIを叩くクライアントを書くことがあって、クエリをベタ書きするのはともかく返り値にマッピングされるようなstructの型を用意するのが面倒すぎる。正常系だけならそれでもまだなんとかなるかもしれないけど、異常系のことも考えて書く……となると気が遠くなる。
なんとかならないかと思って探していたら表題のクライアントを見つけた。GitHub - shurcooL/graphql: Package graphql provides a GraphQL client implementation. をフォークして機能追加したライブラリらしい。
使ってみた
以下のようなGraphQLスキーマがあるとする。実際のスキーマからはだいぶ端折っている。
type Artwork implements Node { id: ID! title: String! caption: String! nsfw: Boolean! topIllust: Illust } type Illust implements Node { """The ID of the object.""" id: ID! thumbnailUrl: String! }
たとえば以下のようなGraphQLクエリを発行したいとする。
query artworkInfoQuery($id: ID!){ node(id: $id) { ... on Artwork { title caption nsfw topIllust { thumbnailUrl } } } }
以下のような無名structを作ってあげたら、変数も渡しつつリクエストできる。inline fragmentもシャッと書ける。これだけでGraphQLクエリを手書きする手間、レスポンスのJSONに合わせたstructを作る手間、異常系をハンドリングする手間が1つにまとまった。
graphqlClient := graphql.NewClient(graphqlAPIEndpoint, nil) var artworkInfoQuery struct { Node struct { Artwork struct { Title graphql.String Caption graphql.String Nsfw graphql.Boolean TopIllust struct { ThumbnailUrl graphql.String } } `graphql:"... on Artwork"` } `graphql:"node(id: $id)"` } err = graphqlClient.Query(context.Background(), &artworkInfoQuery, map[string]interface{}{ "id": graphql.ID(artworkID), }) if err != nil { log.Print(err) return }
ちょっとGraphQL APIを叩いてなんかやりたい、ぐらいのときには愛用することになりそう。
オタクグッズに関する考察
前から見ると部活のパーカーみたいに見えるけど、後ろには部員の写真がデカデカと載っている、と考えるとおもしろい気がする。部活のパーカーを作るとして、部員の顔をデカデカと載せることはないと思う。
↓これの話です。
吉祥寺.pm 29でトークした #kichijojipm
レギュレーションに則って*1一句用意してから臨みました。発表資料は以下です。
自分にとって馴染みのない分野の業務に飛び込むという「挑戦」だったけど、振り返ってみればこれまでと変わらない方法で着実に身につけて知識を展開してきたのではないだろうか、という話をしました。技術的な詳細に触れずに自分なりのノウハウを展開できたと思います。このブログ記事を読んでいる皆様の、新しいことに取り組むときの心がけを教えてほしいです。
今回は「挑戦」がテーマということで、様々なことに挑戦してうまくいった話、うまくいかなかった話などをいろいろ聞くことができてよかったです。こういった発表を見ると、刺激を受けてなにか新しいことに手を出してみたくなります。
*1:リモート開催に句会レギュレーションは適用されるのか?