简体   繁体   中英

typeorm efficient bulk update

I have an update query using typeorm on a postgresql database, like the one below, which is performed on a list of 20+ items frequently (once every 30 sec). It takes approx. 12 seconds for the update, which is a lot for my limits.

for (item of items) {
    await getConnection().createQueryBuilder().update(ItemEntity)
        .set({status: item.status, data: item.data})
        .whereInIds(item.id).execute();
}

Is it possible to perform such a bulk update in a single query, instead of iterating other the items? If so - how?

item.status and item.data are unique for each item.

Using pure psql this can be done as described in the answers to: Update multiple rows in same query using PostgreSQL

However, the UpdateQueryBuilder from Typeorm does not support a from clause. For now, I think that a raw query is the only way, ie getManager().query("raw sql ...") .

There is a way to do a workaround for this through upsert

Using an array of data that is already on the db and using ON CONFLICT to update it.

const queryInsert = manager
    .createQueryBuilder()
    .insert()
    .into(Entity)
    .values(updatedEntities)
    .orUpdate(["column1", "column2", "otherEntityId"], "PK_table_entity")
    .execute();

will run something like:

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"

But you need to be aware that orUpdate does not support using Entity relations, you will need to pass the id column of a relation entity. It also doesnt do any manipulation for the naming strategy. Another problem is that it only works if you're not using @PrimaryGeneratedColumn for your pk (you can use @PrimaryColumn instead)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM