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

AWS Amplify Gen2:自定义SQL变更后如何返回更新数据?

解决方案

要在Amplify Gen2自定义SQL变更后返回更新后的记录,需调整SQL语句并保持正确的返回类型配置,具体步骤如下:

1. 修改自定义SQL语句

MySQL 8.0不支持UPDATE ... RETURNING语法,但可通过多语句SQL先执行更新,再查询目标记录以返回更新后的数据。更新putTankWithBooleans.sql文件内容:

UPDATE TANKS
SET 
    STATUS = COALESCE(:STATUS, STATUS),
    DESCRIPTION = COALESCE(:DESCRIPTION, DESCRIPTION),
    ACTIVE = COALESCE(:ACTIVE, ACTIVE),
    AUTO = COALESCE(:AUTO, AUTO),
    UPDATED_AT = NOW()
WHERE ID = :ID;

-- 更新后立即查询该记录,返回最新数据
SELECT * FROM TANKS WHERE ID = :ID;

若需避免并发修改导致的不一致问题,可用事务包裹语句:

START TRANSACTION;

UPDATE TANKS
SET 
    STATUS = COALESCE(:STATUS, STATUS),
    DESCRIPTION = COALESCE(:DESCRIPTION, DESCRIPTION),
    ACTIVE = COALESCE(:ACTIVE, ACTIVE),
    AUTO = COALESCE(:AUTO, AUTO),
    UPDATED_AT = NOW()
WHERE ID = :ID;

SELECT * FROM TANKS WHERE ID = :ID;

COMMIT;

2. 保持mutation的返回类型配置

继续使用.returns(a.ref('TANKS')),因为最后一条SELECT语句返回的结构与Amplify生成的TANKS模型完全匹配,Amplify会自动将查询结果映射为对应的模型对象:

putTankWithBooleans: a
  .mutation()
  .arguments({
    ID: a.integer().required(),
    STATUS: a.string(),
    DESCRIPTION: a.string(),
    ACTIVE: a.integer(),
    AUTO: a.integer(),
    // ... 其他字段
  })
  .returns(a.ref('TANKS'))
  .handler(a.handler.sqlReference('./mutations/putTankWithBooleans.sql'))

问题原因解释

  • 使用.returns(a.json())时,Amplify会返回SQL执行的第一个语句结果(即UPDATE的受影响行数),而非后续查询的数据。
  • 仅使用UPDATE语句并指定.returns(a.ref('TANKS'))时,UPDATE本身不返回表结构数据,Amplify无法映射到TANKS模型,因此返回全null。
  • 之前添加SELECT报错大概率是SQL语法问题(如缺少分号分隔语句),或RDS用户未被授予执行多语句的权限。

额外注意事项

  • 确保RDS MySQL的数据库用户拥有SELECT和UPDATE权限,若使用事务还需TRANSACTION权限。
  • 若TANKS模型有特定字段需要返回,可将SELECT *替换为指定字段列表(如SELECT ID, STATUS, DESCRIPTION, ACTIVE, AUTO, UPDATED_AT FROM TANKS WHERE ID = :ID),避免返回不必要的字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 21:07:19