我正在尝试使用TypeORM库更新数百条数据库记录。问题是,在执行批量上载并停止整个操作时,有时会从SQL返回重复的错误。是否可以以这样的方式设置TypeORM,从而忽略重复条目并执行插入?该表使用两个主键:

这是我的insert命令(TypeORM + Nestjs):
public async saveBulk(historicalPrices: IHistoricalPrice[]) {
if (!historicalPrices.length) {
return;
}
const repoPrices = historicalPrices.map((p) => this.historicalPricesRepository.create(p));
await this.historicalPricesRepository.save(repoPrices, { chunk: 200 });
}提前感谢
发布于 2022-10-21 06:58:08
您必须使用InsertQueryBuilder来保存实体,而不是repository.save方法。InsertQueryBuilder将允许您调用一个额外的方法orIgnore(),该方法将向mysql INSERT语句中添加IGNORE文字。mysql官方文档:
使用插入忽略时,对于包含不匹配值的行,插入操作将悄然失败,但插入匹配的行。
一个缺点--很明显,你现在必须把这些行分块在你自己身上。InsertQueryBuilder没有为实体块提供任何选项。您的代码应该如下所示:
for (let i = 0; i < historicalPrices.length; i += 200) {
const chunk = historicalPrices.slice(i, i + 200);
const targetEntity = this.historicalPricesRepository.target;
await this.historicalPricesRepository
.createQueryBuilder()
.insert()
.into(targetEntity)
.values(chunk)
.orIgnore()
.execute();
}https://stackoverflow.com/questions/74143751
复制相似问题