如何防止已删除记录出现在AWS Amplify GraphQL查询结果中?
Amplify GraphQL API 已删除条目过滤问题说明
默认开启数据同步/冲突检测的Amplify GraphQL API,确实会返回软删除标记为_deleted: true的数据条目,你没有遗漏常规配置项。
当前版本原生自动生成的查询逻辑存在明确限制:
- 自动生成的
listXYZTable、syncXYZTable查询,默认没有开放_deleted字段作为合法查询过滤参数,无法在请求参数层面直接过滤已删除条目。
你观察到的不同端表现差异是客户端侧过滤导致的,不是接口行为不一致:
- DataStore SDK在客户端侧做了硬编码逻辑,拿到API返回数据后会自动剔除
_deleted=true的条目,不会向上层业务暴露 - Amplify Studio的「内容」管理面板同样是在前端拿到接口返回后做了一层过滤,并非接口层面拦截了已删除数据,才会出现可视化界面看不到、直接调API能拿到的逻辑割裂问题。
如果需要在直接调用GraphQL API的场景过滤已删除条目,可使用以下两种落地方法:
- 自定义查询解析器
修改对应模型list、sync查询的请求映射模板,在DynamoDB查询条件中默认追加_deleted = :false的过滤规则,从接口层面默认不返回已删除数据。如果有管理员查询已删除数据的需求,可以单独新增专属查询接口,配置对应权限后放开过滤规则即可。 - 调用侧手动过滤
若不想调整后端解析器配置,所有直接调用API的角色(数据科学家、运维管理人员等)拿到返回结果后,手动剔除_deleted字段为true的条目即可。注意处理sync增量同步场景时不要误删删除标记,否则会导致客户端同步状态异常。
注意:不要直接修改自动生成的GraphQL Schema,尝试给
_deleted系统字段加索引或查询参数的操作会在下次执行amplify push时被自动生成的模板覆盖,自定义改动不会持久生效。
内容的提问来源于stack exchange,提问作者orome
相关产品推荐
相关产品推荐

