GraphQL for Python.
This library is a port of graphql-js to Python and currently is up-to-date with release 0.6.0.
See more complete documentation at http:https://graphql.org/ and http:https://graphql.org/docs/api-reference-graphql/.
For questions, ask Stack Overflow.
An overview of the GraphQL language is available in the README for the Specification for GraphQL.
The overview describes a simple set of GraphQL examples that exist as tests in this repository. A good way to get started is to walk through that README and the corresponding tests in parallel.
Install from pip:
pip install graphql-core
GraphQL.js provides two important capabilities: building a type schema, and serving queries against that type schema.
First, build a GraphQL type schema which maps to your code base.
from graphql import (
graphql,
GraphQLSchema,
GraphQLObjectType,
GraphQLField,
GraphQLString
)
schema = GraphQLSchema(
query= GraphQLObjectType(
name='RootQueryType',
fields={
'hello': GraphQLField(
type= GraphQLString,
resolver=lambda *_: 'world'
)
}
)
)
This defines a simple schema with one type and one field, that resolves
to a fixed value. The resolve
function can return a value, a promise,
or an array of promises. A more complex example is included in the top
level tests directory.
Then, serve the result of a query against that type schema.
query = '{ hello }'
result = graphql(schema, query)
# Prints
# {'hello': 'world'} (as OrderedDict)
print result.data
This runs a query fetching the one field defined. The graphql
function will
first ensure the query is syntactically and semantically valid before executing
it, reporting errors otherwise.
query = '{ boyhowdy }'
result = graphql(schema, query)
# Prints
# [GraphQLError('Cannot query field "boyhowdy" on type "RootQueryType".',)]
print result.errors
The graphql query is executed, by default, synchronously (using SyncExecutor
).
However the following executors are available if we want to resolve our fields in parallel:
graphql.execution.executors.asyncio.AsyncioExecutor
: This executor executes the resolvers in the Python asyncio event loop.graphql.execution.executors.gevent.GeventExecutor
: This executor executes the resolvers in the Gevent event loop.graphql.execution.executors.process.ProcessExecutor
: This executor executes each resolver as a process.graphql.execution.executors.thread.ThreadExecutor
: This executor executes each resolver in a Thread.graphql.execution.executors.sync.SyncExecutor
: This executor executes each resolver synchronusly (default).
You can specify the executor to use via the executor keyword argument in the grapqhl.execution.execute
function.
from graphql.execution.execute import execute
execute(schema, ast, executor=SyncExecutor())