【问题标题】:TypeORM Cascade Delete类型ORM级联删除
【发布时间】:2018-08-28 00:47:59
【问题描述】:

删除我的实体时遇到问题,我有以下部分代码

@ManyToOne(type => Comment, comment => comment.replies, {
    onDelete: "CASCADE"
})
parent: Comment;

和

@OneToMany(type => Comment, comment => comment.parent)
replies: Comment[];

我已经尝试过manager.remove(comment) 和

await manager
    .createQueryBuilder()
    .delete()
    .from(Comment)
    .where("id = :id", { id: comment.id })
    .execute();

两者都不起作用,是不是有什么问题,我该怎么做,这是我的选择查询

let comment = await manager
    .createQueryBuilder(Comment, "comment")
    .leftJoinAndSelect("comment.user", "user")
    .where("comment.id = :id", { id: request.body.comment })
    .getOne();

得到的错误是

UnhandledPromiseRejectionWarning: QueryFailedError: ER_ROW_IS_REFERENCED_2: Cannot delete or update a parent row: a foreign key constraint fails

提前致谢。

【问题讨论】:

  • 尽管这个问题的措辞不是很好,但您添加的代码示例以及它最终起作用的事实帮助我弄清楚了如何正确配置级联操作。谢谢!

标签: node.js typescript typeorm


【解决方案1】:

显然我必须删除所有表并重新迁移onDelete: "CASCADE" 才能生效但工作

【讨论】:

    【解决方案2】:

    下一次,更改模型中的属性“onDelete”,并创建迁移以在您的数据库上更改它。

    【讨论】:

      【解决方案3】:

      可能是您在实体中有以下装饰器。

        @DeleteDateColumn()
        deletedAt: Date;
      

      如果你有这个装饰器,然后已经在服务中打开。您会看到它尊重 deletedAt 时间并且实际上并没有将其从数据库中删除,而是如果尊重标志,服务将自动不返回它。

      { useSoftDelete: true })
      

      接下来我会检查数据库中实际设置的内容。如果您使用的是 synchronize true,那么它可能会正确反映,但您应该使用迁移来创建用于生产目的的所有内容,否则可能会丢失数据。

      干杯,祝你好运!

      【讨论】:

        猜你喜欢
        • 2011-09-04
        • 2014-10-21
        • 1970-01-01
        • 1970-01-01
        • 2019-12-26
        • 1970-01-01
        • 1970-01-01
        • 2015-04-24
        • 1970-01-01
        相关资源
        最近更新 更多