批量删除 ExecuteDelete
`ExecuteDelete` 直接在数据库端执行 DELETE,无需加载实体。
基本用法
let affected = ctx
.set::<Blog>()
.query()
.filter(linq!(|b: Blog| b.rating < 2))
.execute_delete()
.await?;
println!("Deleted {} blogs", affected);
清空全表
// ⚠️ 危险操作,无 WHERE 条件会删除全表
let affected = ctx
.set::<LogEntry>()
.query()
.execute_delete()
.await?;
与 RemoveAt 的区别
| 方式 | 机制 | 适用场景 | |------|------|----------| | `execute_delete()` | 数据库端 DELETE | 大批量删除,不需要加载实体 | | `remove_at()` + `save_changes()` | 内存标记 + 事务 DELETE | 需要拦截器触发或关联级联 |
设计要点
| 实践 | 说明 | |------|------| | 删除前先 `any()` 确认 | 避免无意义的空 DELETE | | 软删除场景用 `ExecuteUpdate` | 将 `deleted_at` 设为当前时间,而非物理删除 |
下一节:[RemoveRange 与 LoadAll](remove-range-load-all.md)