【问题标题】:Nested Hasura GraphQL Upsert mutation is there a way to stop nesting on conflict?嵌套 Hasura GraphQL Upsert 突变有没有办法停止嵌套冲突?
【发布时间】:2021-12-01 22:01:57
【问题描述】:

我使用 Hasura,我有类似社交网络的情况。 其中我有一个“用户”对象和一个“提要”对象。 每个用户都有一个提要。 我的关系从 user.id 到 feed.id。

相关突变为UpsertUserDetails,如下:

  mutation UserDetailsUpsert(
    $email: String!
    $picture: String
  ) {
    insert_users_one(
      object: {
        email: $email
        feed: { data: {} }
        picture: $picture
      }
      on_conflict: { constraint: users_tid_email_key, update_columns: [picture] }
    ) {
      id
    }
  }

所以当我创建一个新用户时,它也会为它创建一个提要。

但是当我只更新用户详细信息时,我不希望它创建新的提要。 我想阻止 upsert 进入关系而不是上述默认行为。

根据本手册,我看不出它是否可能:https://hasura.io/docs/latest/graphql/core/databases/postgres/mutations/upsert.html#upsert-in-nested-mutations

要允许在嵌套情况下进行更新插入,请设置 update_columns: []。通过这样做,在发生冲突的情况下,冲突的列将被更新为新值(这与它们之前的值相同,因此将有效地保持它们不变),并将允许 upsert 通过。

谢谢!

【问题讨论】:

  • 是否存在用户应该能够拥有多个提要的情况?您是否考虑过在提要表内的user_id 列上设置唯一约束以防止这种情况发生?
  • 这对我来说是个问题,因为提要也可以用于Groups,因此需要将通用 ID 字段限制在两个表上。有可能吗?

标签: postgresql graphql hasura graphql-mutation


【解决方案1】:

我建议您在设计架构时,首先不能输入错误数据。您可以在feed 表上放置部分唯一索引,以防止创建重复的提要。由于您同时拥有用户和组,因此您可以使用 2 个部分索引来实现它。

CREATE UNIQUE INDEX unique_feed_per_user ON feed (user_id)
    WHERE user_id IS NOT NULL;

CREATE UNIQUE INDEX unique_feed_per_group ON feed (group_id)
    WHERE group_id IS NOT NULL;

【讨论】:

    猜你喜欢
    • 2021-05-08
    • 2019-08-24
    • 2017-07-28
    • 2020-11-06
    • 2020-04-24
    • 2018-08-24
    • 2021-04-09
    • 2020-12-09
    相关资源
    最近更新 更多