Обновление значения столбца в таблице Postgres с помощью мутации Graphql

Basic info: использование Postgres в бэкэнде и GraphQL во фронтэнде с использованием Postgraphile.

Need: Используйте мутацию GraphQL для обновления строки в базе данных Postgres.

Code: Предположим, у меня есть схема library_account, в которой есть таблица книг в Postgres, в которой есть такие поля, как id, title, заемщик_id и is_available.

Scenario: Берут в долг впервые.

Proposed flow: сделайте мутацию GraphQL, чтобы обновить таблицу 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.

Какие-либо предложения??


person Raj    schedule 26.02.2019    source источник


Ответы (1)


При построении запросов и мутаций в GraphQL часто бывает разумным использовать такой клиент, как GraphiQL, который поможет вам, предоставив документацию, предоставив вам возможности автозаполнения и выделив места, где произошли ошибки. PostGraphile имеет встроенный GraphiQL; он включен по умолчанию в интерфейсе командной строки, но если вы используете его в режиме библиотеки, вы должны передать 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
    }
  }
}

Я также использовал camelCase для ваших имен полей, но если вы загрузили настраиваемый инфлектор, это может быть ненужным / желательным.

person Benjie    schedule 27.02.2019
comment
Большое спасибо, Бенджи. В итоге я использовал что-то похожее, но я предполагаю, что это сработает так же хорошо. Кроме того, люди вроде меня, которые плохо знакомы с GraphiQL, могут протестировать эту мутацию с помощью переменных запроса! - person Raj; 28.02.2019