批量垂直更新Aurora MySQL列值

时间:2018-03-30 07:36:58

标签: python mysql amazon-web-services aws-lambda amazon-rds-aurora

所以我使用的是Aurora MYSQL数据库,我的AWS Lambda实例需要执行以下操作。 假设一个表有两列,ID和Translated ID。 我有一个Lambda函数,它将ID作为输入,并输出Translated ID。它还可以获取ID列表,并返回已翻译ID的列表。 问题是现在,我正在逐行完成工作流程: 1.从表中获得前100行,其中已翻译的ID为null, 2.对于每一行,检索ID,使用API​​获取翻译的ID。 3.使用已翻译的ID更新行。 4.冲洗并重复所有100排。

问题是由于在其间涉及api的延迟,逐行操作导致lambda函数超时。有没有办法进行批处理操作,同时仍然将已翻译的IDS与相应的ID垂直对齐?类似的东西:

  1. 从表中获得前100名IDS,其中已翻译的ID为空。
  2. 使用API​​获取所有100个IDS的列表,并获取100个已翻译ID的相应列表。
  3. Pefro(最好在一个更新命令中)更新所有100个ID行及其对应的Translated-id列。

1 个答案:

答案 0 :(得分:1)

4个查询:

(0)。确保环境干净(如果您从不重用数据库连接,可以省略此环境)。

DROP TEMPORARY TABLE IF EXISTS my_updates;

(1)。创建临时表以保存新值。

CREATE TEMPORARY TABLE my_updates (
  id INT NOT NULL,
  translated_id INT NOT NULL,
  PRIMARY KEY(id)
);

(2)。在批量插入中插入所有新值。

INSERT INTO my_updates (id, translated_id)
VALUES (?,?), (?,?), (?,?), ...

重复(?,?)×100。将200个元素的数组传递给此查询。一些MySQL库具有多行插入的快捷方式,其他需要构建行参数占位符集。

(3)。您现在在服务器上拥有所有100个新元组,因此您可以要求它更新... join。

UPDATE base_table b
  JOIN my_updates m ON m.id = b.id
   SET b.translated_id = m.translated_id;

您也可以在一个查询中执行此操作,但有点复杂:

UPDATE base_table
   SET translated_id = CASE id
       WHEN @i1 THEN @ti1
       WHEN @i2 THEN @ti2
       ...
       WHEN @i100 THEN @ti100
       ELSE translated_id END
 WHERE id IN (@i1,@i2,...@i100);

我在这里使用@value作为占位符来解释其中的内容,因为它不像上面的示例那么直观,但是这个查询实际上也应该使用?占位符来完成。传递的参数将是一个包含300个成员的数组,其中包含100组(id,translated_id),然后是WHERE的所有(id)值。 ELSE是一种安全预防措施......它永远不应该被实现,但如果是,则不会覆盖任何数据。