在 TypeORM 中处理自动删除孤立行(orphaned rows),通常是指在关联关系(如一对多或多对一关系)中,当某个实体被删除时,其相关联的实体也应当被自动删除,以避免数据库中出现没有任何引用的孤立数据。
要在 TypeORM 中实现这一功能,主要有两种方法:
1. 使用级联删除 (Cascade Delete)
在 TypeORM 中,你可以在定义实体关系时,通过设置 cascade: ["remove"]
来启用级联删除。这样,当一个实体被删除时,所有与之关联的实体也将被自动删除。
示例:
假设有两个实体,User
和 Photo
,其中 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 回复