// 调试:查询 calendar_reminder 数据库中"多肉"相关的批量插入记录统计 const path = require('path'); const fs = require('fs'); const Database = require('better-sqlite3'); const DB_PATH = path.join(process.cwd(), 'data', 'calendar_reminder.db'); console.log('DB exists:', fs.existsSync(DB_PATH), DB_PATH); if (!fs.existsSync(DB_PATH)) { process.exit(1); } const db = new Database(DB_PATH, { readonly: true }); db.pragma('journal_mode = WAL'); console.log('\n=== 表结构 ==='); db.prepare("PRAGMA table_info(events)").all().forEach(c => { console.log(` ${c.name} (${c.type})`); }); const total = db.prepare('SELECT COUNT(1) AS c FROM events').get().c; console.log(`\n总记录数 events: ${total}`); const byDel = db.prepare('SELECT deleted, COUNT(1) AS c FROM events GROUP BY deleted').all(); console.log('\n按 deleted 分组:'); byDel.forEach(r => console.log(` deleted=${r.deleted} -> ${r.c}`)); // 查询"多肉"相关(title / content 包含"多肉") const kw = '%多肉%'; const succuAll = db.prepare("SELECT COUNT(1) AS c FROM events WHERE title LIKE ? OR content LIKE ?").get(kw, kw).c; console.log(`\n含「多肉」的事件(title/content): ${succuAll}`); if (succuAll > 0) { const rows = db.prepare("SELECT id, title, substr(content,1,80) AS content, start, end, remindAt, recurrence, createdAt, updatedAt, deleted, completed FROM events WHERE title LIKE ? OR content LIKE ? ORDER BY createdAt DESC LIMIT 50").all(kw, kw); console.log(`\n多肉记录抽样(最近 50 条):`); rows.forEach(r => { const tag = [ r.deleted ? '🗑删' : null, r.completed ? '✅完' : null, r.recurrence ? '🔁' + r.recurrence : null, r.remindAt ? '⏰' : null ].filter(Boolean).join(''); console.log(` [${r.createdAt ? r.createdAt.slice(0,16) : '?'}] ${r.id.slice(0,8)} | ${r.title || '(无题)'} ${tag} | start=${r.start ? r.start.slice(0,16) : '?'} | content=${r.content || ''}`); }); // 按 title 分组统计(看批量插入的规律) const byTitle = db.prepare("SELECT title, COUNT(1) AS c, MIN(start) AS firstStart, MAX(start) AS lastStart FROM events WHERE title LIKE ? OR content LIKE ? GROUP BY title ORDER BY c DESC LIMIT 30").all(kw, kw); console.log('\n按 title 聚合(多肉相关)TOP30:'); byTitle.forEach(r => console.log(` x${String(r.c).padStart(4,' ')} | ${r.firstStart ? r.firstStart.slice(0,10) : ''}~${r.lastStart ? r.lastStart.slice(0,10) : ''} | ${r.title || '(空)'}`)); // 按创建日期分组,看是否有批量插入特征 const byDay = db.prepare(`SELECT substr(createdAt,1,10) AS d, COUNT(1) AS c, COUNT(DISTINCT title) AS titles FROM events WHERE title LIKE ? OR content LIKE ? GROUP BY substr(createdAt,1,10) ORDER BY d DESC LIMIT 30`).all(kw, kw); console.log('\n按 createdAt 日期聚合(多肉相关)TOP30:'); byDay.forEach(r => console.log(` ${r.d} x${String(r.c).padStart(4,' ')} distinct_titles=${r.titles}`)); // 按 recurrence 分组 const byRecur = db.prepare("SELECT recurrence, COUNT(1) AS c FROM events WHERE (title LIKE ? OR content LIKE ?) GROUP BY recurrence ORDER BY c DESC").all(kw, kw); console.log('\n按 recurrence 分组:'); byRecur.forEach(r => console.log(` [${r.recurrence || '(无)'}] x${r.c}`)); // 删除 / 未删除 / 已完成比例 const stat = db.prepare(`SELECT COUNT(1) AS total, SUM(CASE WHEN deleted=1 THEN 1 ELSE 0 END) AS del, SUM(CASE WHEN deleted=0 THEN 1 ELSE 0 END) AS alive, SUM(CASE WHEN deleted=0 AND completed=1 THEN 1 ELSE 0 END) AS aliveDone, SUM(CASE WHEN deleted=0 AND completed=0 THEN 1 ELSE 0 END) AS aliveTodo FROM events WHERE title LIKE ? OR content LIKE ?`).get(kw, kw); console.log('\n多肉记录状态:'); console.log(` 总数=${stat.total} 删除=${stat.del} 存活=${stat.alive} 存活中已完成=${stat.aliveDone} 存活中待办=${stat.aliveTodo}`); } db.close();