所以我使用的是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垂直对齐?类似的东西:
答案 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
是一种安全预防措施......它永远不应该被实现,但如果是,则不会覆盖任何数据。