GraphQLのクエリビルダー作った
2019-09-12

tl; dr

なぜ作った?

GraphQLの勉強をしようと思ったときに, pythonのサンプルを見るとクエリが直書きでした。
ref: https://github.com/prisma/python-graphql-client#usage


from graphqlclient import GraphQLClient

client = GraphQLClient('http://graphql-swapi.parseapp.com/')

result = client.execute('''
{
  allFilms {
    films {
      title
    }
  }
}
''')

print(result)

まぁいい感じのクエリビルダーあるだろ~って思ってたら案外見つけられなかったっていうのと, とりあえずGraphQLに触れて学べたらなってことで作ってみることにしました。車輪の再発明になったとしてもokということで。
(ちなみにpython以外ならクエリビルダーあった。)

gql-query-builder

Install

pip でどうぞ。


pip install gql-query-builder

Usage

ベーシックな使い方です。
method chainで繋いでいきます。

  • query

from gql_query_builder import GqlQuery

query = GqlQuery().fields(['name']).query('hero').operation().generate()
print(query)
"""
query {
    hero {
        name
    }
}
"""
  • mutation

from gql_query_builder import GqlQuery

query = GqlQuery().fields(['stars', 'commentary']).query('createReview', input={"episode": "$ep", "review": "$review"}).operation('mutation', name='CreateReviewForEpisode', input={"$ep": "Episode!", "$review": "ReviewInput!"}).generate()
print(query)
"""
mutation CreateReviewForEpisode($ep: Episode!, $review: ReviewInput!) {
    createReview(episode: $ep, review: $review) {
        stars
        commentary
    }
}
"""

https://graphql.org/learn/queries/ に書かれているクエリの作る例をGithubにあげているのでこちらも参考に。

実例

実際に動くコードだと下記のようになります。
Public GraphQL APIsに国情報を取得できるAPIがあったのでそこにリクエストするコードです。


from gql_query_builder import GqlQuery
from graphqlclient import GraphQLClient


if __name__ == '__main__':
    # create client
    client = GraphQLClient('https://countries.trevorblades.com/')

    # generate query
    query = GqlQuery()\
        .fields(['name', 'native', 'emoji'])\
        .query('country', input={"code": '"JP"'})\
        .operation('query')\
        .generate()

    # execute
    response = client.execute(query)
    print(response)

まとめ

  • 機能的に足りない部分もあると思うけども, とりあえず基本的なクエリは作れると思う
  • GraphQLの理解は進んだので目的達成