TypeORM 在批量保存时抛出重复错误,而不是忽略或更新现有值
Posted
技术标签:
【中文标题】TypeORM 在批量保存时抛出重复错误,而不是忽略或更新现有值【英文标题】:TypeORM Throwing Duplication Error on Bulk saving instead of ignore or update existing value 【发布时间】:2020-05-21 08:22:26 【问题描述】:如 TypeOrm FrameWork Repository.save
中所述,应保存/插入新值并忽略/更新现有值一次,
但现在我面临一个问题,它在现有值上抛出了 duplication error
并停止了整个插入! (我有一个名为key
的独特专栏)
我的实体:
import Entity, Column, PrimaryGeneratedColumn, ManyToOne, JoinColumn, PrimaryColumn from 'typeorm';
import Source from '../sources/source.entity';
@Entity( name: 'articles' )
export class Article
@PrimaryGeneratedColumn()
id: number;
@Column()
title: string;
@Column(
nullable: true
)
image: string | null;
@Column(
type: "text",
)
url: string;
@Column(
type: "varchar",
unique: true
)
key: string;
@Column(
type: 'datetime',
nullable: true
)
date: Date | null;
@ManyToOne(type => Source, source => source.articles, eager: true)
@JoinColumn(name: 'source')
source: Source;
@Column(
type: `text`,
nullable: true
)
description: string | null
我的服务:
constructor(
@InjectRepository(Article) private readonly articleRepository: Repository<Article>,
private readonly articlesScraper: BlogScraperService
)
async clonningFromScraper()
let articles = await this.articlesScraper.articles('1');
articles = articles.map(article => ( ...article, key: decodeURIComponent(article.url).substring(0, 255) ));
return this.articleRepository
.save(articles);
【问题讨论】:
【参考方案1】:我最终使用以下方法通过 RAW SQL 查询解决了这个问题
return this.articleRepository.query(
"INSERT IGNORE INTO articles ( title, date, url, image, source, description, _key ) VALUES ?", [querableArticles]);
【讨论】:
如果您不喜欢使用查询方法,您可以随时使用 queryBuilder 解决方案:typescript await connection.createQueryBuilder().insert().into(Post).values(post2).onConflict(`("id") DO NOTHING`).execute();
您可以在此处获取更多示例:github.com/typeorm/typeorm/blob/master/test/functional/…
不幸的是,这个修复它对我不起作用,仍然返回 dup error
我尝试过的代码 this.articleRepository .createQueryBuilder().insert().values(articles).onConflict(
("_key") DO NOTHING).execute();
冲突属性只有_key
,对吧?这个“守卫”不会消耗重复错误,如果有另一个属性,它也有一个唯一的限制。
我猜我的主键 id
但我没有在我的请求中传递它。
ON CONFLICT 语句仅支持 postgres 和 cockroach。以上是关于TypeORM 在批量保存时抛出重复错误,而不是忽略或更新现有值的主要内容,如果未能解决你的问题,请参考以下文章
尝试访问损坏的图片 url 时抛出内部服务器错误 500 而不是 404
在 oracle apex 中使用 sqlerm 和异常时抛出重复的错误代码
Mongoose 在使用 .save() 方法更新文档时抛出 E11000 重复键错误
LayerKit 的 newConversationWithParticipants 总是在第一次调用时抛出 FMDatabase “不是错误”