Schema¶
A GraphQL Schema defines the types and relationships between Fields in your API.
A Schema is created by supplying the root ObjectType of each operation, query (mandatory), mutation and subscription.
Schema will collect all type definitions related to the root operations and then supply them to the validator and executor.
my_schema = Schema(
query=MyRootQuery,
mutation=MyRootMutation,
subscription=MyRootSubscription
)
A Root Query is just a special ObjectType that defines the fields that are the entrypoint for your API. Root Mutation and Root Subscription are similar to Root Query, but for different operation types:
- Query fetches data
- Mutation changes data and retrieves the changes
- Subscription sends changes to clients in real-time
Review the GraphQL documentation on Schema for a brief overview of fields, schema and operations.
Querying¶
To query a schema, call the execute
method on it. See Executing a query for more details.
query_string = 'query whoIsMyBestFriend { myBestFriend { lastName } }'
my_schema.execute(query_string)
Types¶
There are some cases where the schema cannot access all of the types that we plan to have.
For example, when a field returns an Interface
, the schema doesn’t know about any of the
implementations.
In this case, we need to use the types
argument when creating the Schema:
my_schema = Schema(
query=MyRootQuery,
types=[SomeExtraObjectType, ]
)
Auto camelCase field names¶
By default all field and argument names (that are not
explicitly set with the name
arg) will be converted from
snake_case
to camelCase
(as the API is usually being consumed by a js/mobile client)
For example with the ObjectType the last_name
field name is converted to lastName
:
class Person(graphene.ObjectType):
last_name = graphene.String()
other_name = graphene.String(name='_other_Name')
In case you don’t want to apply this transformation, provide a name
argument to the field constructor.
other_name
converts to _other_Name
(without further transformations).
Your query should look like:
{
lastName
_other_Name
}
To disable this behavior, set the auto_camelcase
to False
upon schema instantiation:
my_schema = Schema(
query=MyRootQuery,
auto_camelcase=False,
)