乐闻世界logo
搜索文章和话题

How to auto-remove orphaned rows in TypeORM?

4 个月前提问
3 个月前修改
浏览次数30

1个答案

1

在 TypeORM 中处理自动删除孤立行(orphaned rows),通常是指在关联关系(如一对多或多对一关系)中,当某个实体被删除时,其相关联的实体也应当被自动删除,以避免数据库中出现没有任何引用的孤立数据。

要在 TypeORM 中实现这一功能,主要有两种方法:

1. 使用级联删除 (Cascade Delete)

在 TypeORM 中,你可以在定义实体关系时,通过设置 cascade: ["remove"] 来启用级联删除。这样,当一个实体被删除时,所有与之关联的实体也将被自动删除。

示例:

假设有两个实体,UserPhoto,其中 User 可以有多个 Photo

typescript
@Entity() export class User { @PrimaryGeneratedColumn() id: number; @OneToMany(() => Photo, photo => photo.user, { cascade: ["remove"] }) photos: Photo[]; } @Entity() export class Photo { @PrimaryGeneratedColumn() id: number; @ManyToOne(() => User, user => user.photos) user: User; }

在这个例子中,如果删除一个 User 实体,与之关联的所有 Photo 实体也将被自动删除。

2. 使用数据库的外键约束

另一种方式是在数据库层面设置外键约束,确保当一个记录被删除时,所有引用该记录的行也会被删除。这通常在数据库表的创建阶段通过SQL语句实现。

在TypeORM中,你可以在定义实体关系时通过 onDelete: "CASCADE" 选项来实现这一点。

示例:

typescript
@Entity() export class Photo { @PrimaryGeneratedColumn() id: number; @ManyToOne(() => User, user => user.photos, { onDelete: "CASCADE" }) user: User; }

在这个例子中,如果一个 User 实体被删除,数据库将自动删除所有与之关联的 Photo 实体,因为设置了 onDelete: "CASCADE"

总结

在选择使用级联删除还是外键约束时,需要考虑应用的实际需求和数据库的性能。级联删除提供了更多的灵活性和易用性,因为它是由 ORM 框架管理的。而数据库的外键约束则更依赖于数据库的实现,通常在性能上更优,但可能在跨不同数据库时需要调整。

2024年6月29日 12:07 回复

你的答案