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
相关产品推荐
相关产品推荐

