GraphQL 模式到 python 数据类代码生成

问题描述 投票:0回答:5

我有一个从服务器定义的 GraphQL 架构,我想为其编写一个漂亮的 Python GraphQL 客户端。我正在寻找一种方法将我的 GraphQL 模式转换为带有类型提示的 python 类,这样我就能够看到所有可用的查询、突变、它们的字段(名称和类型)并返回值。

由于模式复杂性,我无法手动编写所有 python 类,每个字段都有很多过滤器。请参阅 ent on TodoWhereInput 上的

this example
以了解如何删除错误。我真的很喜欢使用
GraphQL playground
和自动完成功能,我希望在我的 python 客户端中获得这种体验。

例如,将此模式作为输入:

type Book {
  title: String
  year: Int
}

type Author {
  name: String
  books: [Book]
}

我想生成这个Python代码作为输出:

from dataclasses import dataclass

@dataclass
class Book:
  title: str
  year: int

@dataclass
class Author:
  name: str
  books: list[Book]

模式中的

Input
相同。

我已经看过了:

  1. codegen 对于打字稿来说非常棒!但没有 python 支持:/

  2. gql_schema_codegen很好,但是生成不是数据类的

    TypedDict
    ,我必须更改每个字典并传递
    total=False
    ,因此默认情况下不需要所有字段。

  3. sgqlc 代码生成器 不允许类型提示。编写查询仍然是动态的并且错误修剪。

python graphql code-generation type-hinting
5个回答
1
投票

我实际上正在开发一个代码生成器,作为库的一部分,其目标是在从 python 查询 GraphQL API 服务器时允许使用代码优先的方法。

让您预览一下结果:

class Book(GQLObject):
  title: str
  year: int

class Author(GQLObject):
  name: str
  books: list[Book]

我刚刚在github上发布了映射器的核心:

https://github.com/dapalex/py-graphql-mapper/

看看文档,我希望尽快发布代码生成器。


1
投票

您可以使用我的项目从某些 GraphQL 模式文件生成数据模型https://denisart.github.io/graphql2python/

现在可以了! 即将添加新设置以实现更灵活的生成:

  • 定制进口;
  • 自定义模板;
  • 输入对象的渲染;
  • 渲染挂钩;

https://countries.trevorblades.com/架构和 gql 客户端的简单示例: https://denisart.github.io/graphql2python/gql.html

此外,我们还可以使用该包通过 python 类生成 GraphQL 查询

https://denisart.github.io/graphql-query/


1
投票
有关如何从 GQL 模式生成类的另一个示例可以在

qenerate 中找到。它为查询创建简单的数据类,甚至支持使用片段来减少重复的类生成。该模式是通过利用 GraphQL 的 Introspection 功能获得的。

qenerate 本身不是客户端。它旨在与其他 GQL 客户端一起使用。它仅专注于为给定的查询/片段定义生成相应的类。

免责声明:我在创建 qenerate 的团队中工作。


0
投票
感谢所有的答案,但在重新审视这个问题后,我发现

Ariadne

是适合我的情况的最佳解决方案。基于 GraphQL 架构 + 查询生成异步/同步客户端,高度可配置。

欢迎您亲自尝试:

https://github.com/mirumee/ariadne-codegen


© www.soinside.com 2019 - 2024. All rights reserved.