我有两个表cuts
和holds
。响应应用程序中的事件,我希望能够将值从具有给定hold
的{{1}}条目移到id
表中。天真的方法是先做cuts
,然后再做INSERT
。
如何在AppSync解析器中运行多个sql语句以实现该结果?我尝试了以下操作(将DELETE
替换为sql
并将其转换为数组)没有成功。
statements
}
答案 0 :(得分:0)
如果您在https://github.com/aws-samples/aws-appsync-rds-aurora-sample上找到了“使用Amazon Aurora通过AWS Lambda作为数据源的AWS AppSync”,则将无法在sql字段中发送多个语句
如果您将AWS AppSync集成与Aurora Serverless Data API结合使用,则最多可以在一个语句数组中传递2条语句,如下例所示:
{
"version": "2018-05-29",
"statements": [
"select * from Pets WHERE id='$ctx.args.input.id'",
"delete from Pets WHERE id='$ctx.args.input.id'"
]
}
答案 1 :(得分:0)
您将能够执行以下操作。如果您使用的是https://github.com/aws-samples/aws-appsync-rds-aurora-sample上的“通过AWS Lambda将Amazon Aurora用作数据源的AWS AppSync”。
在解析器中,添加“ sql0”和“ sql1”字段(您可以根据需要命名):
{
"version" : "2017-02-28",
"operation": "Invoke",
#set($id = $util.autoId())
"payload": {
"sql":"INSERT INTO cuts (id, rollId, length, reason, notes, orderId)",
"sql0":"SELECT '$id', rollId, length, reason, notes, orderId FROM holds WHERE id=:ID",
"sql1":"DELETE FROM holds WHERE id=:ID",
"variableMapping": {
":ID": "$context.arguments.id"
},
"responseSQL": "SELECT * FROM cuts WHERE id = '$id'"
}
}
在您的lambda中,添加以下代码:
if (event.sql0) {
const inputSQL0 = populateAndSanitizeSQL(event.sql0, event.variableMapping, connection);
await executeSQL(connection, inputSQL0);
}
if (event.sql1) {
const inputSQL1 = populateAndSanitizeSQL(event.sql1, event.variableMapping, connection);
await executeSQL(connection, inputSQL1);
}
通过这种方法,您可以将任意数量的sql语句发送到lambda,然后lambda将执行它们。