gql#
The special example for gql users.
Step 1#
Download GraphQL schema from https://countries.trevorblades.com/ and run graphql2python with her:
# graphql2python.yaml
schema: ./schema.graphql
output: ./model.py
options:
each_field_optional: true
scalar_pytypes:
Boolean: bool
You will receive the following file model.py:
"""Auto-generated by graphql2python."""
# pylint: disable-all
# mypy: ignore-errors
import enum
import typing as _t
from datetime import date, datetime
from pydantic import BaseModel, Field
__all__ = [
"GraphQLBaseModel",
# scalars
"Boolean",
"ID",
"String",
"_Any",
# enums
# unions
"_Entity",
# interfaces
# objects
"Continent",
"Country",
"Language",
"State",
"_Service",
]
class GraphQLBaseModel(BaseModel):
"""Base Model for GraphQL object."""
class Config:
allow_population_by_field_name = True
json_encoders = {
# custom output conversion for datetime
datetime: lambda dt: dt.isoformat()
}
smart_union = True
# The `Boolean` scalar type represents `true` or `false`.
Boolean = bool
# The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID
# type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an
# input type, any string (such as `"4"`) or integer (such as `4`) input value will be accepted as an ID.
ID = str
# The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most
# often used by GraphQL to represent free-form human-readable text.
String = str
# A Scalar type
# See https://graphql.org/learn/schema/#scalar-types
_Any = str
# A Union type
# See https://graphql.org/learn/schema/#union-types
_Entity = _t.Union[
'Continent',
'Country',
'Language',
]
class Continent(GraphQLBaseModel):
"""
An Object type
See https://graphql.org/learn/schema/#object-types-and-fields
"""
code: _t.Optional['ID'] = Field(default=None)
countries: _t.Optional[_t.List['Country']] = Field(default_factory=list)
name: _t.Optional['String'] = Field(default=None)
typename__: _t.Literal["Continent"] = Field(default="Continent", alias="__typename")
class Country(GraphQLBaseModel):
"""
An Object type
See https://graphql.org/learn/schema/#object-types-and-fields
"""
capital: _t.Optional['String'] = Field(default=None)
code: _t.Optional['ID'] = Field(default=None)
continent: _t.Optional['Continent'] = Field(default=None)
currency: _t.Optional['String'] = Field(default=None)
emoji: _t.Optional['String'] = Field(default=None)
emojiU: _t.Optional['String'] = Field(default=None)
languages: _t.Optional[_t.List['Language']] = Field(default_factory=list)
name: _t.Optional['String'] = Field(default=None)
native: _t.Optional['String'] = Field(default=None)
phone: _t.Optional['String'] = Field(default=None)
states: _t.Optional[_t.List['State']] = Field(default_factory=list)
typename__: _t.Literal["Country"] = Field(default="Country", alias="__typename")
class Language(GraphQLBaseModel):
"""
An Object type
See https://graphql.org/learn/schema/#object-types-and-fields
"""
code: _t.Optional['ID'] = Field(default=None)
name: _t.Optional['String'] = Field(default=None)
native: _t.Optional['String'] = Field(default=None)
rtl: _t.Optional['Boolean'] = Field(default=None)
typename__: _t.Literal["Language"] = Field(default="Language", alias="__typename")
class State(GraphQLBaseModel):
"""
An Object type
See https://graphql.org/learn/schema/#object-types-and-fields
"""
code: _t.Optional['String'] = Field(default=None)
country: _t.Optional['Country'] = Field(default=None)
name: _t.Optional['String'] = Field(default=None)
typename__: _t.Literal["State"] = Field(default="State", alias="__typename")
class _Service(GraphQLBaseModel):
"""
An Object type
See https://graphql.org/learn/schema/#object-types-and-fields
"""
sdl: _t.Optional['String'] = Field(default=None)
typename__: _t.Literal["_Service"] = Field(default="_Service", alias="__typename")
Continent.update_forward_refs()
Country.update_forward_refs()
Language.update_forward_refs()
State.update_forward_refs()
_Service.update_forward_refs()
Step 2#
Create the queries with graphql-query (https://github.com/denisart/graphql-query):
# queries.py
from graphql_query import Operation, Query
continents = Query(name="continents", fields=["code", "name"])
getContinents = Operation(
type="query",
name="getContinents",
queries=[continents]
)
Step 3#
Install gql and do magic
from gql import gql, Client
from gql.transport.aiohttp import AIOHTTPTransport
from queries import getContinents
from model import Continent
# Select your transport with a defined url endpoint
transport = AIOHTTPTransport(url="https://countries.trevorblades.com/")
# Create a GraphQL client using the defined transport
client = Client(transport=transport, fetch_schema_from_transport=True)
# Provide a GraphQL query
query = gql(getContinents.render())
# Execute the query on the transport
result = client.execute(query)
continents = [
Continent.parse_obj(continent)
for continent in result[getContinents.queries[0].name]
]
print(continents)
# [Continent(code='AF', countries=[], name='Africa', typename__='Continent'), Continent(code='AN', countries=[], name='Antarctica', typename__='Continent'), Continent(code='AS', countries=[], name='Asia', typename__='Continent'), Continent(code='EU', countries=[], name='Europe', typename__='Continent'), Continent(code='NA', countries=[], name='North America', typename__='Continent'), Continent(code='OC', countries=[], name='Oceania', typename__='Continent'), Continent(code='SA', countries=[], name='South America', typename__='Continent')]