Typeorm高效批量更新
我有一个使用
typeorm
对postgresql
数据库的更新查询,如下图所示,频繁地(每30秒一次)对20多个项目的列表执行更新查询。这需要大约。更新时间为12秒,这对我的限制来说太多了。
for (item of items) {
await getConnection().createQueryBuilder().update(ItemEntity)
.set({status: item.status, data: item.data})
.whereInIds(item.id).execute();
}
是否可以在单个查询中执行这样的批量更新,而不是迭代其他项?如果是-如何?
item.status
和item.data
对于每个项目都是唯一的。
解决方案
有一种方法可以通过upsert解决此问题
使用数据库上已有的数据数组并使用ON Conflicts更新它。
const queryInsert = manager
.createQueryBuilder()
.insert()
.into(Entity)
.values(updatedEntities)
.orUpdate(["column1", "column2", "otherEntityId"], "PK_table_entity")
.execute();
将运行类似以下内容:
INSERT INTO entity (
"id", "column1", "column2", "otherEntityId"
) VALUES
($1, $2, $3, $4),
($5, $6, $7, $8),
ON CONFLICT
ON CONSTRAINT "PK_table_entity"
DO UPDATE SET
"column1" = EXCLUDED."column1",
"column2" = EXCLUDED."column2",
"otherEntityId" = EXCLUDED."otherEntityId"
但您需要知道orUpdate不支持使用实体关系,您需要传递关系实体的id列。它也不会对命名策略进行任何操作。另一个问题是,只有当您的PK不使用@PrimaryGeneratedColumn(您可以使用@PrimaryColumn)时,它才起作用
相关文章