Typeorm高效批量更新

2022-04-19 00:00:00 postgresql orm javascript typeorm
我有一个使用typeormpostgresql数据库的更新查询,如下图所示,频繁地(每30秒一次)对20多个项目的列表执行更新查询。这需要大约。更新时间为12秒,这对我的限制来说太多了。

for (item of items) {
    await getConnection().createQueryBuilder().update(ItemEntity)
        .set({status: item.status, data: item.data})
        .whereInIds(item.id).execute();
}
是否可以在单个查询中执行这样的批量更新,而不是迭代其他项?如果是-如何?

item.statusitem.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)时,它才起作用

相关文章