Basic info
:使用Postgraphile在后端使用Postgres,在前端使用GraphQL。
Need
:使用GraphQL突变来更新Postgres数据库中的一行。
Code
:
假设我有一个library_account模式,该模式在Postgres中具有book表,该表具有id,title,rower_id和is_available之类的字段。
Scenario
:这是第一次借用。
Proposed flow
:进行GraphQL突变,以使用owner_id更新Postgres表。
我当前正在使用的代码:
mutation BookUpdates(
$title: String,
$borrower_id: Int!, #not really an Int but for the sake of ease.
$author_id: Int!,
$isle_id: Int!,
$is_available: Boolean
) {
updateBookByAuthorIdAndIsleId(input: {
isle_id: $isle_id,
is_available: $is_available,
borrower_id: $borrower_id,
author_id: $author_id
}) {
bookEdge {
node {
author_id
}
}
}
在这里,我收到一个borrower_id
的错误消息,该错误消息指出类型updateBookByAuthorIdAndIsleId
并未定义借款人ID。
有什么建议吗?
答案 0 :(得分:1)
在GraphQL中构造查询和变异时,通常明智的做法是使用诸如GraphiQL之类的客户端,该客户端将通过提供文档,为您提供自动完成功能并突出显示发生错误的地方来为您提供帮助。 PostGraphile具有内置的GraphiQL;默认情况下,它已在CLI上启用,但如果以库模式使用它,则必须传递graphiql: true
才能启用它。无论哪种方式,我都建议您使用--enhance-graphiql
/ enhanceGraphiql: true
标志。如果您将突变放入GraphiQL中,它应该告诉您哪里出错了,甚至可能建议如何解决!
在我看来,您的突变形状略有错误。 PostGraphile遵循中继输入对象变异规范,这意味着我们像您所做的那样,将所有变异输入嵌套在输入参数下。但是,我们还将记录的详细信息归为一组,以便在进行更新时更容易将“内容”与“方式”分开-例如“ what”:authorId: 27, isleId: 93
,“ how”:patch: {text: $text}
-这还允许您更新键(例如,如果您想更改isleId),如果所有列都在其中,则不可能一起。我相信这是您缺少的部分。
我怀疑您的突变看起来应该更像:
mutation BookUpdates(
$borrower_id: Int!, #not really an Int but for the sake of ease.
$author_id: Int!,
$isle_id: Int!,
$is_available: Boolean
) {
updateBookByAuthorIdAndIsleId(input: {
isleId: $isle_id,
authorId: $author_id
bookPatch: {
isAvailable: $is_available,
borrowerId: $borrower_id,
}
}) {
bookEdge {
node {
authorId
}
}
}
我也骆驼了您的字段名称,但是如果您已加载自定义的偏转器,则可能不是必需/不希望的。