詩と創作・思索のひろば

ドキドキギュンギュンダイアリーです!!!

Fork me on GitHub

graph-gophers/dataloaderはv7でgenericsに対応している

GraphQL における N+1 問題の解決の機構として Dataloder と呼ばれるものがあるが、Go でこれを行うときは gqlgen + graph-gophers/dataloader という組み合わせがよく使われるようだ。後者は gqlgen の公式ドキュメントからも参照されているので、gqlgen を使っていれば自然とそうなりそう。

このへんの話は 【GraphQL × Go】 N+1問題を解決するgqlgen + dataloaderの実装方法とCacheの実装オプション - LayerX エンジニアブログ などに詳しい。

さて、この dataloaders ってのを普通に使ってコードを書いてみるとわかるのだけど、ロードのためのキーとして string を、ロードされた結果として interface{} を返すような実装になっている。つまり実際にデータベースにアクセスするような処理ではキーとして渡された string を int に読み替える必要があり、dataloader から返された値を使用するには型アサーションを使う必要がある。ダルい!

ジェネリクスが導入された世なのでラッパーでも書くかと思っていたが、よく調べてみれば掲題のとおりジェネリクスが導入されたバージョンも提供されているようだった。便利ですね。

dataloader package - github.com/graph-gophers/dataloader/v7 - Go Packages

自分が入門したときは日本語で言及されている記事に行き当たらなかったので、今後のために書いておく。

サンプルとして gqlgen + dataloader v7 のコードも書いてみた。

GitHub - motemen/example-gqlgen-dataloader

ジェネリクスが導入されていないバージョンで書いたブランチもあって、diff を見てみると簡単になった様子がわかりやすい。

https://github.com/motemen/example-gqlgen-dataloader/compare/dataloader-legacy..main

thunk() の結果をアレコレしなくてよいのは大変うれしい。今回の例では楽をしてキーを文字列にしているのでそのへんはありがたみが薄く見えるけど、現実的には strconv を挟まなきゃいけないので面倒なはず。

はてなで一緒に働きませんか?