【问题标题】:missing _version, _deleted, and _lastChangedAt fields in the database数据库中缺少 _version、_deleted 和 _lastChangedAt 字段
【发布时间】:2021-11-21 18:08:48
【问题描述】:

我正在开发一个 React Native 应用程序,它使用 Amplify API 连接到 DynamoDB 表。

我在应用程序中使用 DataStore 进行离线数据处理,有一段时间,应用程序的某些早期版本将 API 设置为不可同步,这导致我们的一些数据在没有 _version_deleted 和 @ 的情况下保存987654323@ 字段。

我刚刚修复了错误以使 API 再次可同步,但我们的一些数据现在缺少这些字段,当我尝试从应用程序查询表时收到错误消息。

    Object {
      "locations": null,
      "message": "Cannot return null for non-nullable type: 'Int' within parent 'Capture' (/listCaptures/items[18]/_version)",
      "path": Array [
        "listCaptures",
        "items",
        18,
        "_version",
      ],
    },
    Object {
      "locations": null,
      "message": "Cannot return null for non-nullable type: 'AWSTimestamp' within parent 'Capture' (/listCaptures/items[18]/_lastChangedAt)",     
      "path": Array [
        "listCaptures",
        "items",
        18,
        "_lastChangedAt",
      ],
    },

我不能只对数据库应用一次修复,因为那里有旧版本的客户端连接到数据库,不断生成缺少字段的记录。

我想在新版本的程序开始修复表中的“损坏”记录时进行某种检查,但首先我需要能够从应用程序中查询它。

这是我在 qraphql 架构中的一张表:

type DatabaseConversion @model {
    id: ID!
    userID: String!
    ConversionID: String!
}

这是自动生成的查询,当缺少 _version_deleted_lastChangedAt 字段时会引发错误:

export const listDatabaseConversions = /* GraphQL */ `
  query ListDatabaseConversions(
    $filter: ModelDatabaseConversionFilterInput
    $limit: Int
    $nextToken: String
  ) {
    listDatabaseConversions(
      filter: $filter
      limit: $limit
      nextToken: $nextToken
    ) {
      items {
        id
        userID
        ConversionID
        _version
        _deleted
        _lastChangedAt
        createdAt
        updatedAt
      }
      nextToken
      startedAt
    }
  }
`;

我的问题是,我如何在模式中定义一个只查找必要字段的自定义查询,并且它可以找到所有记录而不会引发错误?

我想如果我尝试在新版本的应用程序中使用它的当前内容更新记录,那将自动创建缺失的字段。

【问题讨论】:

  • 我遇到了同样的错误,我不知道我的配置可能不正确。你能指引我正确的方向吗?
  • 我的 API 未设置为可同步。在此处添加“ResolverConfig”:amplify/backend/api/captureStore/transform.conf.json:{“Version”:5,“ElasticsearchWarning”:true,“ResolverConfig”:{“project”:{“ConflictHandler”:“AUTOMERGE” , "ConflictDetection": "版本" } } }

标签: amazon-web-services amazon-dynamodb schema amplify


【解决方案1】:

我找到的解决方案是将自动生成的查询代码复制到一个新文件中,例如:src/customGraphQL/customQueries.js。重命名查询,并删除不必要的字段,它可以用作自动生成的查询。

export const customListDatabaseConversions = /* GraphQL */ `
  query CustomListDatabaseConversions(
    $filter: ModelDatabaseConversionFilterInput
    $limit: Int
    $nextToken: String
  ) {
    listDatabaseConversions(
      filter: $filter
      limit: $limit
      nextToken: $nextToken
    ) {
      items {
        id
        userID
        ConversionID
      }
      nextToken
      startedAt
    }
  }
`;

【讨论】:

    猜你喜欢
    • 2019-09-13
    • 1970-01-01
    • 2011-08-01
    • 2016-04-04
    • 2014-12-24
    • 2017-02-14
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多