使用 Graphql 突变更新 Postgres table 中的列值
Update a column value in a Postgres table using Graphql mutation
Basic info
: 后端使用 Postgres,前端使用 GraphQL,使用 Postgraphile。
Need
:使用 GraphQL 突变更新 Postgres 数据库中的一行。
Code
:
假设我有一个 library_account 模式,它在 Postgres 中有书 table,它有像 id、title、borrower_id 和 is_available 这样的字段。
Scenario
: 第一次借。
Proposed flow
:进行 GraphQL 突变以使用 borrower_id.
更新 Postgres table
我目前使用的代码:
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
的错误,它说 borrower_id 不是由类型 updateBookByAuthorIdAndIsleId
定义的。
有什么建议吗??
在 GraphQL 中构建查询和变更时,使用 GraphiQL 之类的客户端通常是明智的,它将通过提供文档、为您提供自动完成功能并突出显示错误位置来帮助您。 PostGraphile 内置了 GraphiQL;它在 CLI 上默认启用,但如果您在库模式下使用它,则必须通过 graphiql: true
来启用它。无论哪种方式,我都建议您使用 --enhance-graphiql
/ enhanceGraphiql: true
标志。如果你将你的变异放入 GraphiQL,它应该会告诉你哪里出了问题,甚至可能会建议如何修复它!
在我看来,你的变异形状有点不对。 PostGraphile 遵循中继输入对象突变规范,这意味着我们将所有突变输入嵌套在输入参数下,就像您所做的那样。但是,我们还将有关记录的详细信息分组在一起,以便在进行更新时更容易将 "what" 与 "how" 分开 - 例如"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
}
}
}
我也对您的字段名称进行了驼峰式命名,但如果您加载了自定义变形器,这可能不是 necessary/desirable。
Basic info
: 后端使用 Postgres,前端使用 GraphQL,使用 Postgraphile。
Need
:使用 GraphQL 突变更新 Postgres 数据库中的一行。
Code
:
假设我有一个 library_account 模式,它在 Postgres 中有书 table,它有像 id、title、borrower_id 和 is_available 这样的字段。
Scenario
: 第一次借。
Proposed flow
:进行 GraphQL 突变以使用 borrower_id.
我目前使用的代码:
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
的错误,它说 borrower_id 不是由类型 updateBookByAuthorIdAndIsleId
定义的。
有什么建议吗??
在 GraphQL 中构建查询和变更时,使用 GraphiQL 之类的客户端通常是明智的,它将通过提供文档、为您提供自动完成功能并突出显示错误位置来帮助您。 PostGraphile 内置了 GraphiQL;它在 CLI 上默认启用,但如果您在库模式下使用它,则必须通过 graphiql: true
来启用它。无论哪种方式,我都建议您使用 --enhance-graphiql
/ enhanceGraphiql: true
标志。如果你将你的变异放入 GraphiQL,它应该会告诉你哪里出了问题,甚至可能会建议如何修复它!
在我看来,你的变异形状有点不对。 PostGraphile 遵循中继输入对象突变规范,这意味着我们将所有突变输入嵌套在输入参数下,就像您所做的那样。但是,我们还将有关记录的详细信息分组在一起,以便在进行更新时更容易将 "what" 与 "how" 分开 - 例如"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
}
}
}
我也对您的字段名称进行了驼峰式命名,但如果您加载了自定义变形器,这可能不是 necessary/desirable。