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(

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.


To query a schema, call the execute method on it. See Executing a query for more details.

query_string = 'query whoIsMyBestFriend { myBestFriend { lastName } }'


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(
    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:


To disable this behavior, set the auto_camelcase to False upon schema instantiation:

my_schema = Schema(