Python中如何使用新的GraphQL实现,更加现代的方法?

最近我司也开始使用 GraphQL 了,真香是真香,尤其是前端的同学会比较喜欢 : ), 选择的实现也是官方的 Graphene 与 graphql-core。但用着用着发现 graphql-core 的使用方法极其的反直觉,连带着基于它的 Graphene 等等都十分难用。究其根本,在于 graphql-core 是直接“翻译”的 graphql.js 的实现,所以其行为方式完全与 Python 相左。

痛过之后我还是决定新写一个 Python 实现:Pygraphy,使其更加符合 Python 的编写习惯,在调整了 GraphQL 的类型声明设计之后,一切都严丝合缝了。在使用体验上 Pygraphy 更加接近于 ORM 并且舍弃了 Graphene 与 Strawberry 基于 graphql-core 所带来的不和谐。

如果对于设计的细节有疑问,我在 graphql-core 的 issue 下详细地说明了细节,欢迎来讨论。


Python中如何使用新的GraphQL实现,更加现代的方法?

11 回复

赞一个


对于现代Python GraphQL实现,我推荐使用Strawberry。它是基于Python类型注解的GraphQL库,代码更简洁、类型安全。

import strawberry
from typing import List, Optional

# 定义数据模型
@strawberry.type
class Book:
    title: str
    author: str
    year: int

# 模拟数据
books_data = [
    Book(title="Python编程", author="作者A", year=2022),
    Book(title="GraphQL实战", author="作者B", year=2023),
]

# 定义查询
@strawberry.type
class Query:
    @strawberry.field
    def books(self) -> List[Book]:
        return books_data
    
    @strawberry.field
    def book_by_title(self, title: str) -> Optional[Book]:
        return next((b for b in books_data if b.title == title), None)

# 创建schema
schema = strawberry.Schema(query=Query)

# 执行查询
query = """
    {
        books {
            title
            author
        }
        bookByTitle(title: "Python编程") {
            year
        }
    }
"""

result = schema.execute_sync(query)
print(result.data)

主要优势:

  1. 使用Python类型注解,无需重复定义schema
  2. 支持异步(async/await)
  3. 与Pydantic良好集成
  4. 内置数据加载器(Dataloader)解决N+1问题

替代方案可以考虑Ariadne(schema-first)或Graphene(成熟但较旧)。Strawberry目前是最符合现代Python开发习惯的选择。

用Strawberry吧,类型注解写起来很顺手。

看来我也要学 GraphQL 了

GraphQL 很好,我博客项目上试用了一下,发现一旦掌握它的思路,用起来很爽。

我用了很长时间了。再去写 REST 发现难受的一逼

如果已经有在使用 Graphene 或者其它 GraphQL 实现的话,可以尝试一下 Pygraphy。

看起来挺优雅的,现在个人项目用的是魔改的 graphene-peewee-async,用起来有点僵硬,周末用这个试试手

如果有好的建议以及 bug 反馈,欢迎联系我,email 以及其它联系方式均可。

不由想起了另一个引战贴:ApiJson
[APIJSON-以坚持和偏执,回敬傲慢和偏见 - 孤独的探索号 - 博客园]( https://www.cnblogs.com/tommylemon/p/6573740.html)
楼主怎么看?

本质上没有太大区别,不过由于舍弃了 JSON 作为传输协议,GraphQL 更加人类可读。另外假设你决定要实现一个第三方库,然后你去找了 GraphQL 的 spec: https://graphql.github.io/graphql-spec/June2018/ ,然后你又看了看 JSONAPI 的 spec: https://jsonapi.org/format/ 。你会决定做哪个?高下立判。GraphQL 在标准化以及组件支持上比 JSONAPI 要好。

GraphQL 可以看做是更精细的 RPC 协议

回到顶部