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

AppSync DynamoDB Schema自定义主键后报id字段未定义错误如何解决

核心结论

你的认知没有问题:AppSync + Amplify GraphQL Transformer 原生支持通过@primaryKey指定自定义主键,完全替代框架默认生成的id字段。
报错本质是配置缺失:你没有显式关闭@model自动注入默认id字段的开关,导致框架自动生成的订阅、变更逻辑仍然在引用不存在的默认id字段,触发GraphQL校验错误。

报错原因

@model指令默认开启autoIdField: true配置,会自动完成三个默认行为:

  • 给当前类型自动注入id: ID!字段作为默认主键
  • 所有自动生成的CRUD入参、订阅返回逻辑,默认绑定读取id字段
  • 所有关联关系(@hasOne/@hasMany/@manyToMany)默认使用id作为关联外键
    你仅给sessionId添加了@primaryKey标记,但没有修改默认的autoIdField配置,框架不会自动把全局对默认id的引用替换为你的自定义主键,因此自动生成的onCreateSession订阅尝试读取不存在的id字段时,就会抛出你看到的FieldUndefined错误。

修复步骤

  1. 调整Schema配置,关闭自动id生成,同时显式给关联关系指定外键为你的自定义主键,修正后的类型定义如下:
type Session 
  @model(autoIdField: false)
  @auth(rules: [{allow: public}, { allow: owner }, { allow: groups, groups: ["Admin"] }]) 
{
  sessionId: ID! @primaryKey
  numPeoplePresent: Int
  procedures: Procedures @hasOne(references: ["sessionId"])
  notes: String
  cattle: [Cow] @manyToMany(relationName: "CowSessions", references: ["sessionId"])
}

注意:如果关联的Procedures、Cow类型也使用了自定义主键,需要在对应类型的关联字段上同步配置正确的引用字段,避免后续关联查询报错。

  1. 推送更新后的Schema到云端,执行命令时添加参数允许Schema结构调整:
amplify push --allow-destructive-graphql-schema-updates

该参数仅用于允许框架删除之前自动生成的冗余id相关配置,不会丢失你已存储的业务数据。

  1. 云端部署完成后,重新生成客户端侧的模型定义,保证本地代码和云端Schema一致:
amplify codegen models

完成以上步骤后,相关报错就会消失,所有CRUD、订阅、关联逻辑都会正常使用你自定义的sessionId作为主键。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 06:21:31