首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >typeorm高效批量更新

typeorm高效批量更新
EN

Stack Overflow用户
提问于 2020-10-09 23:10:35
回答 2查看 2K关注 0票数 2

我有一个在postgresql数据库上使用typeorm的更新查询,就像下面的查询一样,它频繁地(每30秒执行一次)在20+条目列表上执行。这需要大约。12秒的更新时间,这对于我的限制来说太多了。

代码语言:javascript
运行
复制
for (item of items) {
    await getConnection().createQueryBuilder().update(ItemEntity)
        .set({status: item.status, data: item.data})
        .whereInIds(item.id).execute();
}

有没有可能在单个查询中执行这样的批量更新,而不是迭代其他项?如果是这样--如何实现?

item.statusitem.data对于每一项都是唯一的。

EN

回答 2

Stack Overflow用户

发布于 2020-12-23 22:57:07

使用纯psql可以做到这一点,如Update multiple rows in same query using PostgreSQL的答案所述。

但是,来自Typeorm的UpdateQueryBuilder不支持from子句。目前,我认为原始查询是唯一的方法,即getManager().query("raw sql ...")

票数 1
EN

Stack Overflow用户

发布于 2021-10-25 23:58:52

有一种方法可以通过upsert解决此问题

使用数据库上已有的数据数组,并使用on冲突来更新它。

代码语言:javascript
运行
复制
const queryInsert = manager
    .createQueryBuilder()
    .insert()
    .into(Entity)
    .values(updatedEntities)
    .orUpdate(["column1", "column2", "otherEntityId"], "PK_table_entity")
    .execute();

将运行类似以下内容:

代码语言:javascript
运行
复制
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 )时,它才有效。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64282704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档