【问题标题】:TypeORM Throwing Duplication Error on Bulk saving instead of ignore or update existing valueTypeORM 在批量保存时抛出重复错误,而不是忽略或更新现有值
【发布时间】: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);
}

【问题讨论】:

    标签: javascript mysql typescript nestjs typeorm


    【解决方案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。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    • 2021-02-19
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 2022-08-24
    相关资源
    最近更新 更多