使用 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。