我有一个在postgresql
数据库上使用typeorm
的更新查询,就像下面的查询一样,它频繁地(每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
对于每一项都是唯一的。
发布于 2020-12-23 22:57:07
使用纯psql可以做到这一点,如Update multiple rows in same query using PostgreSQL的答案所述。
但是,来自Typeorm的UpdateQueryBuilder
不支持from
子句。目前,我认为原始查询是唯一的方法,即getManager().query("raw sql ...")
。
发布于 2021-10-25 23:58:52
有一种方法可以通过upsert解决此问题
使用数据库上已有的数据数组,并使用on冲突来更新它。
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 )时,它才有效。
https://stackoverflow.com/questions/64282704
复制相似问题