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 和异常时抛出重复的错误代码

Spark 在尝试保存 CSV 文件时抛出错误

Mongoose 在使用 .save() 方法更新文档时抛出 E11000 重复键错误

PHP在准备SQL语句时抛出致命错误[重复]

LayerKit 的 newConversationWithParticipants 总是在第一次调用时抛出 FMDatabase “不是错误”