You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何定义GraphQL自定义查询解决Amplify DynamoDB缺失系统字段报错

解决方法

1. 编写自定义查询语句

Amplify自动生成的默认查询会携带所有系统字段,你只需要手动编写查询,仅请求你需要的业务字段即可绕开非空校验错误,示例如下:

query ListDatabaseConversionsWithoutSystemFields(
  $filter: ModelDatabaseConversionFilterInput
  $limit: Int
  $nextToken: String
) {
  listDatabaseConversions(
    filter: $filter
    limit: $limit
    nextToken: $nextToken
  ) {
    items {
      # 仅保留业务需要的字段,不要添加_version、_deleted、_lastChangedAt
      id
      userID
      ConversionID
      createdAt
      updatedAt
    }
    nextToken
    startedAt
  }
}

这个查询直接复用Amplify自动生成的listDatabaseConversions查询能力,不需要额外修改后端schema配置。

2. 调用自定义查询拿取数据

你可以用Amplify的API.graphql方法直接调用上述自定义查询,不会触发字段非空报错:

import { API } from 'aws-amplify';

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

const getConversions = async () => {
  const result = await API.graphql({
    query: listQuery,
    variables: { limit: 1000 }
  });
  return result.data.listDatabaseConversions.items;
}

3. 异常记录修复逻辑

拿到所有记录后,你只需要将记录原样保存一次,Amplify后端会自动补全缺失的三个系统字段,示例修复逻辑:

import { DataStore } from 'aws-amplify';
import { DatabaseConversion } from './models';

const fixInvalidRecords = async () => {
  const records = await getConversions();
  for (const record of records) {
    // 原样保存,触发后端自动补全系统字段
    await DataStore.save(DatabaseConversion.copyOf(record, () => {}));
  }
}

你可以将这个修复逻辑放在新版本应用的启动阶段执行,同时可以设置定时执行逻辑,处理旧版本客户端持续生成的异常记录。

内容的提问来源于stack exchange,提问作者Gabriel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 19:24:04