Typeorm高效批量更新 [英] typeorm efficient bulk update

查看:103
本文介绍了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)时,它才起作用

这篇关于Typeorm高效批量更新的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆