GraphQLはFacebookにより開発されたオープンソースの言語。
以降では、GraphQLサーバ環境の構築と簡単な動作確認を行う。
pythonライブラリ graphene を使用してサーバ環境を構築する。
pythonの仮想環境を作って graphene をインストールしておく。
※WebAPIとして提供する為、flask と flask-graphql も同時にインストール。
pip install pipenv pipenv --python 3.7 pipenv install graphene pipenv install flask pipenv install flask-graphql
動作確認用に仮想環境のシェルを起動しておく
pipenv shell
schema.py
# サンプルデータ sample_users = { "1": {"id":1, "name":"Ichiro", "age":10}, "2": {"id":2, "name":"Jiro", "age":20}, "3": {"id":3, "name":"Saburo", "age":30} } class User(graphene.ObjectType): id = graphene.ID() name = graphene.String() age = graphene.Int() class Query(graphene.ObjectType): user = graphene.Field(User, id=graphene.ID()) users = graphene.Field(graphene.List(User)) def resolve_user(self, info, id): # resolve_変数名 """ID指定のユーザ取得.""" user_info = None if id: # if info.variable_values["id"] でも可 user_info = sample_users.get(id) # sample_users.get(info.variable_values["id"]) if user_info: return User(**user_info) else: return None def resolve_users(self, info, **kwargs): """ユーザ一覧の取得.""" return [ User(**sample_users[id]) for id in sample_users] class CreateUser(graphene.Mutation): class Arguments: name = graphene.String() age = graphene.Int() created = graphene.Boolean() user = graphene.Field(lambda: User) def mutate(root, info, name, age): id = len(sample_users) + 1 sample_users[str(id)] = {"id":id, "name":name, "age":age} user = User(id=id, name=name, age=age) return CreateUser(user=user, created=True) class MyMutations(graphene.ObjectType): create_user = CreateUser.Field() schema = graphene.Schema(query=Query, mutation=MyMutations)
test_schema.py
from schema import schema if __name__ == "__main__": # ユーザを作成 query = """ mutation createMutation { createUser(name:"Shiro", age:40) { user { id name age } created } } """ result = schema.execute(query) print(result.data) # 一覧を取得 query = """ query ListQuery { users { id, name, age } } """ result = schema.execute(query) print(result.data) # IDを指定して取得 query = """ query SampleQuery($id: ID) { user(id: $id) { id, name, age } } """ result = schema.execute(query, variable_values={"id": 3}) print(result.data)
動作確認の実行
python test_schema.py OrderedDict([('createUser', OrderedDict([('user', OrderedDict([('id', '4'), ('name', 'Shiro'), ('age', 40)])), ('created', True)]))]) OrderedDict([('users', [OrderedDict([('id', '1'), ('name', 'Ichiro'), ('age', 10)]), OrderedDict([('id', '3'), ('name', 'Saburo'), ('age', 30)]), OrderedDict([('id', '2'), ('name', 'Jiro'), ('age', 20)]), OrderedDict([('id', '4'), ('name', 'Shiro'), ('age', 40)])])]) OrderedDict([('user', OrderedDict([('id', '3'), ('name', 'Saburo'), ('age', 30)]))])
app.py
from schema import schema from flask import Flask from flask_graphql import GraphQLView app = Flask(__name__) app.debug = True app.add_url_rule( '/', view_func=GraphQLView.as_view( 'graphql', schema=schema, graphiql=True # テスト時などにブラウザから利用できるAPIコンソールをONにしておく ) ) if __name__ == '__main__': app.run()
サーバ起動
python app.py
# 一意検索 curl http://127.0.0.1:5000/ --data query='query { user(id: "1") { id, name, age}}' {"data":{"user":{"id":"1","name":"Taro","age":20}}} # 一覧検索 curl http://127.0.0.1:5000/ --data query='query { users{ id, name}}' {"data":{"users":[{"id":"3","name":"Saburo"},{"id":"1","name":"Ichiro"},{"id":"2","name":"Jiro"}]}} # 追加 curl http://127.0.0.1:5000/ --data query='mutation { createUser(name:"Shiro", age:40) { user {id, name, age}, created }}' {"data":{"createUser":{"user":{"id":"4","name":"Shiro","age":40},"created":true}}}
尚、graphiql=True で起動している場合は、ブラウザから任意のQueryを発行する為のコンソール画面も提供されるので、そちらから確認する事も可能。