{"id":769,"library":"graphql-relay","title":"Relay library for graphql-core","description":"graphql-relay-py is the Python port of the JavaScript Relay library for GraphQL, designed to facilitate the creation of Relay-compliant GraphQL servers using graphql-core. It provides utilities for global object identification (Nodes) and cursor-based pagination (Connections). The library maintains a regular release cadence, often aligning with updates to graphql-core and the upstream graphql-relay-js specification. The current version is 3.2.0.","status":"active","version":"3.2.0","language":"python","source_language":"en","source_url":"https://github.com/graphql-python/graphql-relay-py","tags":["graphql","relay","api","pagination","node"],"install":[{"cmd":"pip install graphql-relay graphql-core","lang":"bash","label":"Install with graphql-core"}],"dependencies":[{"reason":"This library is built on top of graphql-core and requires it for core GraphQL functionality. Version 3.x of graphql-relay-py is compatible with graphql-core version 3.x.","package":"graphql-core","optional":false}],"imports":[{"symbol":"connection_args","correct":"from graphql_relay import connection_args"},{"symbol":"connection_definitions","correct":"from graphql_relay import connection_definitions"},{"symbol":"connection_from_array","correct":"from graphql_relay import connection_from_array"},{"symbol":"from_global_id","correct":"from graphql_relay import from_global_id"},{"symbol":"to_global_id","correct":"from graphql_relay import to_global_id"},{"symbol":"global_id_field","correct":"from graphql_relay import global_id_field"},{"symbol":"node_definitions","correct":"from graphql_relay import node_definitions"},{"note":"The `arrayconnection` module was temporarily removed/renamed to `array_connection` in `v3.1.1` and later re-added for backward compatibility in `v3.1.5`. Direct imports from `graphql_relay` for core connection functions like `connection_from_array` are generally preferred.","wrong":"from graphql_relay.connection.arrayconnection import connection_from_array","symbol":"arrayconnection","correct":"from graphql_relay.connection.arrayconnection import connection_from_array_slice"}],"quickstart":{"code":"import graphene\nfrom graphql.execution.execute import execute\nfrom graphql.language.parser import parse\nfrom graphql_relay import node_definitions, global_id_field, connection_definitions, connection_from_array, connection_args, from_global_id\n\nclass User:\n    def __init__(self, id, name):\n        self.id = id\n        self.name = name\n\nusers_data = {\n    \"1\": User(\"1\", \"Alice\"),\n    \"2\": User(\"2\", \"Bob\"),\n}\n\ndef get_user(id):\n    return users_data.get(id)\n\ndef get_object_from_global_id(global_id, info):\n    type_name, id = from_global_id(global_id)\n    if type_name == 'User':\n        return get_user(id)\n    return None\n\nnode_interface, node_field = node_definitions(\n    get_object_from_global_id, lambda obj, info: UserNode if isinstance(obj, User) else None\n)\n\nclass UserNode(graphene.ObjectType):\n    class Meta:\n        name = 'User'\n        interfaces = (node_interface,)\n\n    id = global_id_field('User')\n    name = graphene.String()\n\nUserConnection = connection_definitions(UserNode, 'UserConnection').connection_type\n\nclass Query(graphene.ObjectType):\n    node = node_field\n    users = graphene.Field(\n        UserConnection,\n        args=connection_args,\n        resolve=lambda obj, info, **args:\n            connection_from_array(list(users_data.values()), args)\n    )\n\nschema = graphene.Schema(query=Query)\n\n# Example Usage:\nquery_str = '''\n    query {\n      users (first: 1) {\n        edges {\n          node {\n            id\n            name\n          }\n        }\n      }\n      node(id: \"VXNlcjox\") {\n        id\n        ... on User {\n          name\n        }\n      }\n    }\n'''\n\n# Assuming \"VXNlcjox\" is the global ID for User:1 (to_global_id('User', '1'))\n# Use 'User:1' -> base64 -> 'VXNlcjox'\n\nresult = execute(schema, parse(query_str))\nprint(result.data)\n","lang":"python","description":"This quickstart demonstrates how to set up a basic Relay-compliant GraphQL schema using `graphql-relay` with `graphene`. It includes defining a Node interface for global object identification and a Connection for pagination. It showcases `node_definitions`, `global_id_field`, `connection_definitions`, `connection_from_array`, and `connection_args`."},"warnings":[{"fix":"Migrate your graphql-core dependency to v3.x and update your graphql-relay-py imports and API calls as necessary. Review the graphql-core and graphql-relay-py v3 release notes for specific changes. This also requires Python 3.6+.","message":"Version 3.0.0 introduced significant breaking changes to align with graphql-core version 3.x. Code written for graphql-relay-py v2.x (compatible with graphql-core v2.x) will not work with v3.x without migration.","severity":"breaking","affected_versions":">=3.0.0"},{"fix":"Ensure that your `graphql-relay-py` version matches the expected `graphql-core` major version. For new projects, use `graphql-relay-py` v3.x with `graphql-core` v3.x.","message":"Versions 2.0.0 and 0.5.0 introduced breaking changes relating to compatibility with specific major versions of `graphql-core`. `v2.0.0` was compatible with `graphql-core < 3`, and `v0.5.0` with `graphql-core < 2`.","severity":"breaking","affected_versions":"2.0.0, 0.5.0"},{"fix":"For new code, prefer importing connection-related utilities like `connection_from_array` directly from the top-level `graphql_relay` package. If you must use `arrayconnection`, ensure your version is `3.1.5` or later, or adapt to `array_connection` if on affected versions.","message":"The internal `arrayconnection` module was temporarily renamed to `array_connection` in `v3.1.1` as part of a `snake_case` consistency drive, which could break direct imports. It was later re-added for backward compatibility in `v3.1.5`.","severity":"gotcha","affected_versions":"3.1.1 - 3.1.4"},{"fix":"Update your code to handle `unbase64` returning an empty string for invalid inputs if you were previously relying on exceptions for error handling. Review `from_global_id` usage, especially if parsing IDs from external sources.","message":"The behavior of `unbase64` changed in `v3.1.2` to return an empty string on errors instead of potentially raising an exception, and `from_global_id` behavior was adjusted in `v3.1.3` to match `relay-js`.","severity":"gotcha","affected_versions":">=3.1.2"},{"fix":"Ensure 'graphene' is installed in your Python environment, e.g., by running `pip install graphene`.","message":"The 'graphene' package is a core dependency and must be installed. This error occurs when 'graphene' is not found in the Python environment.","severity":"breaking","affected_versions":"all"},{"fix":"Ensure that the `graphene` package is installed in your environment. You can typically install it using `pip install graphene`.","message":"The 'graphene' package was not found. This indicates that `graphene` is not installed in the environment where the script is being executed.","severity":"breaking","affected_versions":"*"}],"env_vars":null,"search_vec":"'3.2.0':78 'align':59 'api':81 'base':48 'cadenc':57 'compliant':30 'connect':50 'core':6,36,65 'creation':26 'current':75 'cursor':47 'cursor-bas':46 'design':22 'facilit':24 'global':41 'graphql':5,8,21,31,35,64,70,79 'graphql-cor':4,34,63 'graphql-relay-j':69 'graphql-relay-pi':7 'identif':43 'javascript':17 'js':72 'librari':2,19,52 'maintain':53 'node':44,83 'object':42 'often':58 'pagin':49,82 'port':14 'provid':38 'py':10 'python':13 'regular':55 'relay':1,9,18,29,71,80 'relay-compli':28 'releas':56 'server':32 'specif':73 'updat':61 'upstream':68 'use':33 'util':39 'version':76","created_at":"2026-03-29T04:20:53.814837+00:00","updated_at":"2026-04-16T15:27:56.565332+00:00","problems":{"verify_error":"error: Failed to parse: `graphql-relay graphql-core`\n  Caused by: Expected one of `@`, `(`, `<`, `=`, `>`, `~`, `!`, `;`, found `g`\ngraphql-relay graphql-core\n              ^"},"ecosystem":"pypi","meta_description":null,"install_score":100,"quickstart_score":0,"quickstart_tag":"stale","pypi_latest":"3.2.0","cli_name":"","cli_version":null,"type":"library","homepage":null,"github":"https://github.com/graphql-python/graphql-relay-py","docs":null,"changelog":null,"pypi":"https://pypi.org/project/graphql-relay/","npm":null,"openapi_spec":null,"status_page":null,"smithery":null,"categories":["web-framework","serialization"],"base_url":null,"auth_type":null,"provenance":{"verified_status":"passing","verified_at":"2026-06-28","last_verified":"2026-08-27","next_check":"2026-07-05","install_tag":"verified"}}