变更#
与查询相反,GraphQL 中的变更表示修改服务器端数据和/或对服务器造成副作用的操作。例如,您可以在应用程序中创建新实例的变更,或者发送一封电子邮件的变更。与查询一样,它们接受参数,并可以返回常规字段所能返回的任何内容,包括新类型和现有对象类型。这对于在变更后获取对象的新状态非常有用。
让我们改进入门教程中的 books
项目,并实现应该添加一本书的变更:
import strawberry
# 在这个例子中,你可以安全地忽略 Query,它是 strawberry.Schema 所要求的,
# 所以为了完整起见,这里包含了它
@strawberry.type
class Query:
@strawberry.field
def hello() -> str:
return "world"
@strawberry.type
class Mutation:
@strawberry.mutation
def add_book(self, title: str, author: str) -> Book:
print(f"Adding {title} by {author}")
return Book(title=title, author=author)
schema = strawberry.Schema(query=Query, mutation=Mutation)
与查询一样,变更在类中定义,然后传递给 Schema 函数。这里创建了 addBook
变更,它接受标题和作者,并返回 Book
类型。将发送以下 GraphQL 文档到服务器来执行变更:
mutation {
addBook(title: "The Little Prince", author: "Antoine de Saint-Exupéry") {
title
}
}
addBook
变更就是简化的例子。在实际应用程序中,变更通常需要处理错误并将这些错误传递回客户端。例如,如果这本书已经存在,可能希望返回异常。
查看关于处理错误的文档,了解如何从变更中返回类型的并集。
无返回数据的变更#
也可以编写不返回任何东西的变更。它被映射到 Void
GraphQL 标量,并且总是返回 null
@strawberry.type
class Mutation:
@strawberry.mutation
def restart() -> None:
print(f'Restarting the server')
type Mutation {
restart: Void
}
备注
带有 void-result 的变更违背了 GQL 最佳实践。