graphql-core 3.2.6


pip install graphql-core

  Latest version

Released: Jan 26, 2025

Project Links

Meta
Author: Christoph Zwerschke
Requires Python: >=3.6,<4

Classifiers

Development Status
  • 5 - Production/Stable

Intended Audience
  • Developers

Topic
  • Software Development :: Libraries

License
  • OSI Approved :: MIT License

Programming Language
  • Python :: 3
  • Python :: 3 :: Only
  • Python :: 3.6
  • Python :: 3.7
  • Python :: 3.8
  • Python :: 3.9
  • Python :: 3.10
  • Python :: 3.11
  • Python :: 3.12
  • Python :: 3.13

GraphQL-core 3

GraphQL-core 3 is a Python 3.6+ port of GraphQL.js, the JavaScript reference implementation for GraphQL, a query language for APIs created by Facebook.

PyPI version Documentation Status Test Status Lint Status Code Style

The current version 3.2.6 of GraphQL-core is up-to-date with GraphQL.js version 16.8.2.

An extensive test suite with over 2500 unit tests and 100% coverage comprises a replication of the complete test suite of GraphQL.js, making sure this port is reliable and compatible with GraphQL.js.

Note that for various reasons, GraphQL-core does not use SemVer like GraphQL.js. Changes in the major version of GraphQL.js are reflected in the minor version of GraphQL-core instead. This means there can be breaking changes in the API when the minor version changes, and only patch releases are fully backward compatible. Therefore, we recommend using something like ~= 3.2.0 as the version specifier when including GraphQL-core as a dependency.

Documentation

A more detailed documentation for GraphQL-core 3 can be found at graphql-core-3.readthedocs.io.

The documentation for GraphQL.js can be found at graphql.org/graphql-js/.

The documentation for GraphQL itself can be found at graphql.org.

There will be also blog articles with more usage examples.

Getting started

A general overview of GraphQL is available in the README for the Specification for GraphQL. That overview describes a simple set of GraphQL examples that exist as tests in this repository. A good way to get started with this repository is to walk through that README and the corresponding tests in parallel.

Installation

GraphQL-core 3 can be installed from PyPI using the built-in pip command:

python -m pip install graphql-core

You can also use poetry for installation in a virtual environment:

poetry install

Usage

GraphQL-core 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 codebase:

from graphql import (
    GraphQLSchema, GraphQLObjectType, GraphQLField, GraphQLString)

schema = GraphQLSchema(
    query=GraphQLObjectType(
        name='RootQueryType',
        fields={
            'hello': GraphQLField(
                GraphQLString,
                resolve=lambda obj, info: '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 co-routine object or a list of these. It takes two positional arguments; the first one provides the root or the resolved parent field, the second one provides a GraphQLResolveInfo object which contains information about the execution state of the query, including a context attribute holding per-request state such as authentication information or database session. Any GraphQL arguments are passed to the resolve functions as individual keyword arguments.

Note that the signature of the resolver functions is a bit different in GraphQL.js, where the context is passed separately and arguments are passed as a single object. Also note that GraphQL fields must be passed as a GraphQLField object explicitly. Similarly, GraphQL arguments must be passed as GraphQLArgument objects.

A more complex example is included in the top-level tests directory.

Then, serve the result of a query against that type schema.

from graphql import graphql_sync

source = '{ hello }'

print(graphql_sync(schema, source))

This runs a query fetching the one field defined, and then prints the result:

ExecutionResult(data={'hello': 'world'}, errors=None)

The graphql_sync function will first ensure the query is syntactically and semantically valid before executing it, reporting errors otherwise.

from graphql import graphql_sync

source = '{ BoyHowdy }'

print(graphql_sync(schema, source))

Because we queried a non-existing field, we will get the following result:

ExecutionResult(data=None, errors=[GraphQLError(
    "Cannot query field 'BoyHowdy' on type 'RootQueryType'.",
    locations=[SourceLocation(line=1, column=3)])])

The graphql_sync function assumes that all resolvers return values synchronously. By using coroutines as resolvers, you can also create results in an asynchronous fashion with the graphql function.

import asyncio
from graphql import (
    graphql, GraphQLSchema, GraphQLObjectType, GraphQLField, GraphQLString)


async def resolve_hello(obj, info):
    await asyncio.sleep(3)
    return 'world'

schema = GraphQLSchema(
    query=GraphQLObjectType(
        name='RootQueryType',
        fields={
            'hello': GraphQLField(
                GraphQLString,
                resolve=resolve_hello)
        }))


async def main():
    query = '{ hello }'
    print('Fetching the result...')
    result = await graphql(schema, query)
    print(result)


asyncio.run(main())

Goals and restrictions

GraphQL-core tries to reproduce the code of the reference implementation GraphQL.js in Python as closely as possible and to stay up-to-date with the latest development of GraphQL.js.

GraphQL-core 3 (formerly known as GraphQL-core-next) has been created as a modern alternative to GraphQL-core 2, a prior work by Syrus Akbary, based on an older version of GraphQL.js and also targeting older Python versions. Some parts of GraphQL-core 3 have been inspired by GraphQL-core 2 or directly taken over with only slight modifications, but most of the code has been re-implemented from scratch, replicating the latest code in GraphQL.js very closely and adding type hints for Python.

Design goals for the GraphQL-core 3 library were:

  • to be a simple, cruft-free, state-of-the-art GraphQL implementation for current Python versions
  • to be very close to the GraphQL.js reference implementation, while still providing a Pythonic API and code style
  • to make extensive use of Python type hints, similar to how GraphQL.js used Flow (and is now using TypeScript)
  • to use black to achieve a consistent code style while saving time and mental energy for more important matters
  • to replicate the complete Mocha-based test suite of GraphQL.js using pytest with pytest-describe

Some restrictions (mostly in line with the design goals):

  • requires Python 3.6 or newer
  • does not support some already deprecated methods and options of GraphQL.js
  • supports asynchronous operations only via async.io (does not support the additional executors in GraphQL-core)

Note that meanwhile we are using the amazing ruff tool to both format and check the code of GraphQL-core 3, in addition to using mypy as type checker.

Integration with other libraries and roadmap

  • Graphene is a more high-level framework for building GraphQL APIs in Python, and there is already a whole ecosystem of libraries, server integrations and tools built on top of Graphene. Most of this Graphene ecosystem has also been created by Syrus Akbary, who meanwhile has handed over the maintenance and future development to members of the GraphQL-Python community.

    Graphene 3 is now using Graphql-core 3 as core library for much of the heavy lifting.

  • Ariadne is a Python library for implementing GraphQL servers using schema-first approach created by Mirumee Software.

    Ariadne is also using GraphQL-core 3 as its GraphQL implementation.

  • Strawberry, created by Patrick Arminio, is a new GraphQL library for Python 3, inspired by dataclasses, that is also using GraphQL-core 3 as underpinning.

Changelog

Changes are tracked as GitHub releases.

Credits and history

The GraphQL-core 3 library

  • has been created and is maintained by Christoph Zwerschke
  • uses ideas and code from GraphQL-core 2, a prior work by Syrus Akbary
  • is a Python port of GraphQL.js which has been developed by Lee Byron and others at Facebook, Inc. and is now maintained by the GraphQL foundation

Please watch the recording of Lee Byron's short keynote on the history of GraphQL at the open source leadership summit 2019 to better understand how and why GraphQL was created at Facebook and then became open sourced and ported to many different programming languages.

License

GraphQL-core 3 is MIT-licensed, just like GraphQL.js.

3.3.0a10 Sep 28, 2025
3.3.0a9 Jun 18, 2025
3.3.0a8 May 24, 2025
3.3.0a7 Jan 26, 2025
3.3.0a6 Aug 11, 2024
3.3.0a5 Apr 14, 2024
3.3.0a4 Feb 17, 2024
3.3.0a3 Jun 04, 2023
3.3.0a2 Nov 03, 2022
3.3.0a1 Sep 24, 2022
3.2.6 Jan 26, 2025
3.2.5 Oct 13, 2024
3.2.4 Sep 04, 2024
3.2.3 Sep 23, 2022
3.2.2 Sep 22, 2022
3.2.1 Apr 10, 2022
3.2.0 Jan 15, 2022
3.2.0rc5 Jan 15, 2022
3.2.0rc4 Dec 29, 2021
3.2.0rc3 Dec 12, 2021
3.2.0rc2 Sep 30, 2021
3.2.0rc1 Sep 29, 2021
3.1.7 Dec 12, 2021
3.1.6 Aug 20, 2021
3.1.5 May 10, 2021
3.1.4 Apr 08, 2021
3.1.3 Feb 08, 2021
3.1.2 Jul 05, 2020
3.1.1 May 18, 2020
3.1.0 Apr 03, 2020
3.1.0b2 Mar 21, 2020
3.1.0b1 Mar 04, 2020
3.1.0b0 Feb 10, 2020
3.0.6 Dec 29, 2021
3.0.5 May 18, 2020
3.0.4 Apr 03, 2020
3.0.3 Feb 02, 2020
3.0.2 Jan 26, 2020
3.0.1 Dec 06, 2019
3.0.0 Nov 30, 2019
3.0.0b1 Sep 26, 2019
3.0.0b0 Sep 14, 2019
3.0.0a2 Aug 02, 2019
3.0.0a1 Jul 28, 2019
3.0.0a0 Jul 14, 2019
2.3.2 May 12, 2020
2.3.1 Jan 24, 2020
2.3 Jan 23, 2020
2.2.1 Jul 18, 2019
2.2 Jun 07, 2019
2.1 Jul 19, 2018
2.1rc3 Jul 05, 2018
2.1rc2 Jun 13, 2018
2.1rc1 Jun 05, 2018
2.1rc0 Jun 05, 2018
2.0 Oct 25, 2017
2.0.dev20171009101843 Oct 09, 2017
2.0.dev20170801051721 Aug 01, 2017
2.0.dev20170801041408 Aug 01, 2017
1.2.dev20170724044604 Jul 24, 2017
1.1 Apr 19, 2017
1.0.1 Nov 15, 2016
1.0 Sep 26, 2016
1.0.dev20160920065529 Sep 20, 2016
1.0.dev20160909040033 Sep 09, 2016
1.0.dev20160909030348 Sep 09, 2016
1.0.dev20160823054952 Aug 23, 2016
1.0.dev20160822075425 Aug 22, 2016
1.0.dev20160814231515 Aug 14, 2016
0.5.3 Jun 21, 2016
0.5.2 Jun 01, 2016
0.5.1 May 18, 2016
0.5 May 12, 2016
0.5b3 May 12, 2016
0.5b2 May 12, 2016
0.5b1 May 12, 2016
0.4.18 Apr 19, 2016
0.4.17 Apr 19, 2016
0.4.16 Apr 19, 2016
0.4.15 Apr 18, 2016
0.4.14 Apr 16, 2016
0.4.13 Apr 14, 2016
0.4.12.1 Feb 01, 2016
0.4.12 Nov 20, 2015
0.4.11 Nov 19, 2015
0.4.9 Nov 17, 2015
0.4.7b2 Nov 13, 2015
0.4.7b1 Oct 26, 2015
0.4.7b0 Oct 16, 2015
0.1a4 Oct 14, 2015
0.1a3 Oct 10, 2015
0.1a2 Oct 08, 2015
0.1a1 Oct 07, 2015
0.1a0 Oct 06, 2015

Wheel compatibility matrix

Platform Python 3
any

Files in release

Extras: None
Dependencies:
typing-extensions (<5,>=4)