mirror of
https://github.com/graphql-python/graphene.git
synced 2024-11-25 02:53:54 +03:00
1cf303a27b
* Added support for subscription * Added pre-commit hooks for black and formatted changed files * Checked with flake8 * Integrated changes from master. Co-authored-by: Rob Blackbourn <rblackbourn@bhdgsystematic.com> Co-authored-by: Rob Blackbourn <rtb@beast.jetblack.net>
177 lines
4.0 KiB
ReStructuredText
177 lines
4.0 KiB
ReStructuredText
.. _SchemaExecute:
|
|
|
|
Executing a query
|
|
=================
|
|
|
|
|
|
For executing a query against a schema, you can directly call the ``execute`` method on it.
|
|
|
|
|
|
.. code:: python
|
|
|
|
from graphene import Schema
|
|
|
|
schema = Schema(...)
|
|
result = schema.execute('{ name }')
|
|
|
|
``result`` represents the result of execution. ``result.data`` is the result of executing the query, ``result.errors`` is ``None`` if no errors occurred, and is a non-empty list if an error occurred.
|
|
|
|
|
|
For executing a subscription, you can directly call the ``subscribe`` method on it.
|
|
This method is async and must be awaited.
|
|
|
|
.. code:: python
|
|
|
|
import asyncio
|
|
from datetime import datetime
|
|
from graphene import ObjectType, String, Schema, Field
|
|
|
|
# All schema require a query.
|
|
class Query(ObjectType):
|
|
hello = String()
|
|
|
|
def resolve_hello(root, info):
|
|
return 'Hello, world!'
|
|
|
|
class Subscription(ObjectType):
|
|
time_of_day = Field(String)
|
|
|
|
async def subscribe_time_of_day(root, info):
|
|
while True:
|
|
yield { 'time_of_day': datetime.now().isoformat()}
|
|
await asyncio.sleep(1)
|
|
|
|
SCHEMA = Schema(query=Query, subscription=Subscription)
|
|
|
|
async def main(schema):
|
|
|
|
subscription = 'subscription { timeOfDay }'
|
|
result = await schema.subscribe(subscription)
|
|
async for item in result:
|
|
print(item.data['timeOfDay'])
|
|
|
|
asyncio.run(main(SCHEMA))
|
|
|
|
The ``result`` is an async iterator which yields items in the same manner as a query.
|
|
|
|
.. _SchemaExecuteContext:
|
|
|
|
Context
|
|
_______
|
|
|
|
You can pass context to a query via ``context``.
|
|
|
|
|
|
.. code:: python
|
|
|
|
from graphene import ObjectType, String, Schema
|
|
|
|
class Query(ObjectType):
|
|
name = String()
|
|
|
|
def resolve_name(root, info):
|
|
return info.context.get('name')
|
|
|
|
schema = Schema(Query)
|
|
result = schema.execute('{ name }', context={'name': 'Syrus'})
|
|
assert result.data['name'] == 'Syrus'
|
|
|
|
|
|
Variables
|
|
_________
|
|
|
|
You can pass variables to a query via ``variables``.
|
|
|
|
|
|
.. code:: python
|
|
|
|
from graphene import ObjectType, Field, ID, Schema
|
|
|
|
class Query(ObjectType):
|
|
user = Field(User, id=ID(required=True))
|
|
|
|
def resolve_user(root, info, id):
|
|
return get_user_by_id(id)
|
|
|
|
schema = Schema(Query)
|
|
result = schema.execute(
|
|
'''
|
|
query getUser($id: ID) {
|
|
user(id: $id) {
|
|
id
|
|
firstName
|
|
lastName
|
|
}
|
|
}
|
|
''',
|
|
variables={'id': 12},
|
|
)
|
|
|
|
Root Value
|
|
__________
|
|
|
|
Value used for :ref:`ResolverParamParent` in root queries and mutations can be overridden using ``root`` parameter.
|
|
|
|
.. code:: python
|
|
|
|
from graphene import ObjectType, Field, Schema
|
|
|
|
class Query(ObjectType):
|
|
me = Field(User)
|
|
|
|
def resolve_user(root, info):
|
|
return {'id': root.id, 'firstName': root.name}
|
|
|
|
schema = Schema(Query)
|
|
user_root = User(id=12, name='bob'}
|
|
result = schema.execute(
|
|
'''
|
|
query getUser {
|
|
user {
|
|
id
|
|
firstName
|
|
lastName
|
|
}
|
|
}
|
|
''',
|
|
root=user_root
|
|
)
|
|
assert result.data['user']['id'] == user_root.id
|
|
|
|
Operation Name
|
|
______________
|
|
|
|
If there are multiple operations defined in a query string, ``operation_name`` should be used to indicate which should be executed.
|
|
|
|
.. code:: python
|
|
|
|
from graphene import ObjectType, Field, Schema
|
|
|
|
class Query(ObjectType):
|
|
me = Field(User)
|
|
|
|
def resolve_user(root, info):
|
|
return get_user_by_id(12)
|
|
|
|
schema = Schema(Query)
|
|
query_string = '''
|
|
query getUserWithFirstName {
|
|
user {
|
|
id
|
|
firstName
|
|
lastName
|
|
}
|
|
}
|
|
query getUserWithFullName {
|
|
user {
|
|
id
|
|
fullName
|
|
}
|
|
}
|
|
'''
|
|
result = schema.execute(
|
|
query_string,
|
|
operation_name='getUserWithFullName'
|
|
)
|
|
assert result.data['user']['fullName']
|