clean-work-day-statistics-orphans.ts 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. /**
  2. * 清理 work_day_statistics 表中的孤儿数据(work_id 在 works 表中不存在的记录),
  3. * 执行后可运行 database/migrations/clean_work_day_statistics_orphans_and_add_fk.sql 添加外键。
  4. */
  5. import { initDatabase, AppDataSource } from '../models/index.js';
  6. import { logger } from '../utils/logger.js';
  7. async function main() {
  8. try {
  9. await initDatabase();
  10. const qr = AppDataSource.createQueryRunner();
  11. await qr.connect();
  12. try {
  13. // 统计孤儿数据
  14. const countResult = await qr.query(
  15. `SELECT COUNT(*) AS cnt FROM work_day_statistics wds
  16. LEFT JOIN works w ON wds.work_id = w.id
  17. WHERE w.id IS NULL`
  18. );
  19. const orphanCount = Number(countResult?.[0]?.cnt ?? 0);
  20. if (orphanCount === 0) {
  21. logger.info('[CleanOrphans] work_day_statistics 中无孤儿数据。');
  22. } else {
  23. logger.info(`[CleanOrphans] 发现 ${orphanCount} 条孤儿数据,正在删除...`);
  24. const deleteResult = await qr.query(
  25. `DELETE wds FROM work_day_statistics wds
  26. LEFT JOIN works w ON wds.work_id = w.id
  27. WHERE w.id IS NULL`
  28. );
  29. const affected = (deleteResult as { affectedRows?: number })?.affectedRows ?? orphanCount;
  30. logger.info(`[CleanOrphans] 已删除 ${affected} 条孤儿数据。`);
  31. }
  32. // 提示添加外键
  33. logger.info(
  34. '[CleanOrphans] 若需为 work_day_statistics.work_id 添加外键(删除 works 时级联删除),请执行:database/migrations/clean_work_day_statistics_orphans_and_add_fk.sql'
  35. );
  36. } finally {
  37. await qr.release();
  38. }
  39. process.exit(0);
  40. } catch (e) {
  41. logger.error('[CleanOrphans] 执行失败:', e);
  42. process.exit(1);
  43. }
  44. }
  45. void main();