// 只读诊断:用户刚执行的 16 条家人生日 SQL 是否真的入库 // 用法:node dev_test_scripts/debug/diag_birthday_sql.js const path = require('path') const fs = require('fs') const Database = require('better-sqlite3') const DB_PATH = path.join(process.cwd(), 'data', 'calendar_reminder.db') if (!fs.existsSync(DB_PATH)) { console.error('DB NOT FOUND:', DB_PATH); process.exit(2) } const db = new Database(DB_PATH, { readonly: true, fileMustExist: true }) console.log('=== 1. 最近 5 个 calendar_batches(找 sql_ 前缀最新批次) ===') const batches = db.prepare(`SELECT id,title,status,params_json,generated_count,inserted_count,dedup_count,rollback_count,created_at,updated_at FROM calendar_batches ORDER BY rowid DESC LIMIT 5`).all() for (const b of batches) { const p = b.params_json ? JSON.parse(b.params_json) : null console.log(` - [${b.id}] ${b.title} | status=${b.status} | gen=${b.generated_count} ins=${b.inserted_count} dedup=${b.dedup_count} rb=${b.rollback_count} | created=${b.created_at} | range=${p && p.rangeStart}~${p && p.rangeEnd} | source=${p && p.source}`) } console.log('\n=== 2. 搜索 16 条 id 前缀的事件(bd_fa_ / bd_mo_ / bd_si_ / bd_me_) ===') const prefixes = ['bd_fa_', 'bd_mo_', 'bd_si_', 'bd_me_'] const like = prefixes.map(p => `id LIKE '${p}%'`).join(' OR ') const rows = db.prepare(`SELECT id,title,start,end,allDay,remindAt,deleted,completed,batch_id FROM events WHERE ${like} ORDER BY start ASC`).all() console.log(` 命中 ${rows.length} 行(期望 16)`) for (const r of rows) { console.log(` - [${r.id.slice(0,32)}...] ${r.title} | ${r.start} ~ ${r.end} | allDay=${r.allDay} remindAt=${r.remindAt} | deleted=${r.deleted} done=${r.completed} | batch=${r.batch_id}`) } if (rows.length === 16) { const byY = {} for (const r of rows) { const y = r.start.slice(0,4); byY[y] = (byY[y]||0)+1 } console.log(' 按年分布:', JSON.stringify(byY)) const missingRemind = rows.filter(r => !r.remindAt) console.log(' 未设置提醒(期望 0):', missingRemind.length) const notAllDay = rows.filter(r => r.allDay != 1) console.log(' 非全天事件(期望 0):', notAllDay.length) const deletedOnes = rows.filter(r => r.deleted != 0) console.log(' 已逻辑删除(期望 0):', deletedOnes.length) const batch_ids = [...new Set(rows.filter(r => r.batch_id).map(r => r.batch_id))] console.log(' 关联 batch_id 集合(期望 1 个 sql_ 前缀):', batch_ids) } console.log('\n=== 3. 时间跨度 sanity check(期望 start∈[2027-06-15, 2030-12-01]) ===') const span = db.prepare(`SELECT MIN(start) min_s, MAX(end) max_e FROM events WHERE ${like}`).get() console.log(' min start =', span.min_s, ' | max end =', span.max_e)