使用Graphql突变更新Postgres表中的列值

时间:2019-02-26 00:38:38

标签: database postgresql graphql mutation postgraphile

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。

有什么建议吗?

1 个答案:

答案 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
    }
  }
}

我也骆驼了您的字段名称,但是如果您已加载自定义的偏转器,则可能不是必需/不希望的。