通过 TypeORM 中的原始查询批量更新

Bulk update via raw query in TypeORM

如何在 TypeORM 中通过原始查询进行批量更新?
例如,我们有模型 User 和 属性 name
如何在一次交易中更改少数用户的姓名?

typeorm 版本:0.2.7
数据库:postgress

您可以使用 QueryBuilder:

import {getConnection} from "typeorm";

await getConnection()
  .createQueryBuilder()
  .update(User)
  .set({ firstName: "Timber", lastName: "Saw" })
  .where("id = :id", { id: 1 })
  .execute();

query()方法:

getRepository(User).query('UPDATE `users` SET firstName = 'Timber', lastName = 'Saw' WHERE id = 1')

显然,对于批量更新,您可以 .where({ id: In(userIds) }) 使用 QueryBuilder 或 WHERE id IN (${userIds.join(',')}) 使用原始查询。

要批量更新,可以使用update with set方法,当可以使用orm函数时,总是建议不要使用原始查询。


import {getConnection, In} from "typeorm";
const userIds = [1,2,3];

await getConnection()
  .createQueryBuilder()
  .update(User)
  .set({ isaSeniorCitizen: true })
  .where({ id: In(userIds) })
  .execute();

你可以这样做

import {getConnection } from "typeorm";
const userIds = [1,2,3];

await getConnection()
  .createQueryBuilder()
  .update(User)
  .set({ isaSeniorCitizen: true })
  .whereInIds(userIds)
  .execute();

您还可以通过存储库 api 以这种方式更新多行:

await repository.update(
  {
    id: In([1,2,3,4,5]),
  },
  { selected: true },
);

不支持更新具有不同值的多个列。在 Typeorm 仓库中有一个关于此的未解决问题:https://github.com/typeorm/typeorm/issues/7326

@Roman-Pekar 对 Update multiple rows in same query using PostgreSQL 的回答显示了如何使用原始 psql 执行此操作。

另一个“解决方案”是在 postgres 数据库中创建一个存储函数并调用它。在对另一个类似问题的评论之一中,我展示了一个关于如何做到这一点的例子:typeorm efficient bulk update