Как запустить несколько операторов SQL в решателе AppSync? - PullRequest
0 голосов
/ 11 марта 2019

У меня есть две таблицы, cuts и holds.В ответ на событие в моем приложении я хочу иметь возможность перемещать значения из записи hold с заданным значением id в таблицу cuts.Наивный способ - сделать INSERT, а затем DELETE.

. Как выполнить несколько операторов SQL в решателе AppSync для достижения этого результата?Я попытался следующее (заменив sql на statements и превратив его в массив) безуспешно.

{
 "version" : "2017-02-28",
 "operation": "Invoke",

 #set($id = $util.autoId())

"payload": {
    "statements": [
        "INSERT INTO cuts (id, rollId, length, reason, notes, orderId) SELECT '$id', rollId, length, reason, notes, orderId FROM holds WHERE id=:ID",
        "DELETE FROM holds WHERE id=:ID"
    ],
    "variableMapping": {
        ":ID": "$context.arguments.id"
    },
    "responseSQL": "SELECT * FROM cuts WHERE id = '$id'"
}

}

Ответы [ 2 ]

0 голосов
/ 28 марта 2019

Вы сможете сделать это следующим образом. Если вы используете «AWS AppSync Использование Amazon Aurora в качестве источника данных через AWS Lambda», найденный здесь https://github.com/aws-samples/aws-appsync-rds-aurora-sample.

В преобразователе добавьтеполе «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'"
    }
}

Добавьте в ваш лямбду следующий фрагмент кода:

  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, сколько пожелаете, и тогда ваша лямбда выполнит их.

0 голосов
/ 11 марта 2019

Если вы используете «AWS AppSync с использованием Amazon Aurora в качестве источника данных через AWS Lambda», найденный здесь https://github.com/aws-samples/aws-appsync-rds-aurora-sample,, вы не сможете отправить несколько операторов в поле 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'"
    ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...