Typeorm级联删除

时间:2018-03-19 12:44:19

标签: node.js typescript typeorm

我在删除我的实体时遇到了麻烦,我有以下部分代码

@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

提前致谢。

3 个答案:

答案 0 :(得分:1)

下次,在模型中更改属性“ onDelete”,并创建一个迁移以在数据库中对其进行更改。

答案 1 :(得分:0)

显然我必须删除所有表并进行新的迁移才能使onDelete: "CASCADE"生效但有效

答案 2 :(得分:0)

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

  @DeleteDateColumn()
  deletedAt: Date;

如果您具有此装饰器,然后在服务中将其打开。您会看到它尊重deleteAt时间,实际上并没有将其从数据库中删除,但是如果遵守该标志,服务将不会自动将其返回。

{ useSoftDelete: true })

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

干杯,祝你好运!