如何在AppSync解析器中运行多个SQL语句?

时间:2019-03-11 16:07:52

标签: amazon-web-services aws-appsync amazon-rds-aurora

我有两个表cutsholds。响应应用程序中的事件,我希望能够将值从具有给定hold的{​​{1}}条目移到id表中。天真的方法是先做cuts,然后再做INSERT

如何在AppSync解析器中运行多个sql语句以实现该结果?我尝试了以下操作(将DELETE替换为sql并将其转换为数组)没有成功。

statements

}

2 个答案:

答案 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将执行它们。