#!/usr/bin/env node /** * 修复分类重复问题 * 1. 删除"用户身份标签"分类及其所有标签和关系 * 2. 把"家庭角色"移到第一个位置 * 3. 调整其他分类的sort_order */ const Database = require('better-sqlite3'); const path = require('path'); const dbPath = path.join(__dirname, '../dmp_onion.db'); const db = new Database(dbPath); console.log('\n╔════════════════════════════════════════════════════════════════╗'); console.log('║ 🔧 修复分类重复问题 ║'); console.log('╚════════════════════════════════════════════════════════════════╝\n'); try { // 1. 获取用户身份标签的所有标签ID console.log('1️⃣ 获取\"用户身份标签\"的所有标签...'); const tagIds = db.prepare('SELECT id FROM tags WHERE category_id = 33').all(); console.log(` 找到 ${tagIds.length} 个标签`); // 2. 删除相关的user_tags关系 console.log('\n2️⃣ 删除user_tags关系...'); const stmt = db.prepare('DELETE FROM user_tags WHERE tag_id = ?'); let relDeleted = 0; for (const tag of tagIds) { const result = stmt.run(tag.id); relDeleted += result.changes; } console.log(` 删除了 ${relDeleted} 条关系`); // 3. 删除tags console.log('\n3️⃣ 删除标签...'); const tagDeleteResult = db.prepare('DELETE FROM tags WHERE category_id = 33').run(); console.log(` 删除了 ${tagDeleteResult.changes} 个标签`); // 4. 删除分类 console.log('\n4️⃣ 删除分类...'); const catDeleteResult = db.prepare('DELETE FROM tag_categories WHERE id = 33').run(); console.log(` 删除了 ${catDeleteResult.changes} 个分类`); // 5. 更新家庭角色的sort_order到0 console.log('\n5️⃣ 更新\"家庭角色\"的位置...'); db.prepare('UPDATE tag_categories SET sort_order = 0 WHERE id = 46').run(); console.log(' ✓ 家庭角色现在排在第一位'); // 6. 重新调整其他分类的sort_order console.log('\n6️⃣ 重新调整其他分类的顺序...'); const categories = db.prepare('SELECT id, key, name, sort_order FROM tag_categories ORDER BY sort_order').all(); let newOrder = 0; for (const cat of categories) { if (cat.id === 46) continue; // 家庭角色已经是0 if (cat.sort_order !== newOrder) { db.prepare('UPDATE tag_categories SET sort_order = ? WHERE id = ?').run(newOrder, cat.id); } newOrder++; } console.log(` ✓ 调整了 ${newOrder} 个分类`); // 7. 显示最终结果 console.log('\n7️⃣ 最终分类列表:'); const finalCats = db.prepare('SELECT id, key, name, sort_order FROM tag_categories ORDER BY sort_order').all(); for (const cat of finalCats) { console.log(` ${cat.sort_order + 1}. ${cat.name} (ID:${cat.id})`); } // 8. 统计数据 console.log('\n📊 数据统计:'); const stats = db.prepare(` SELECT (SELECT COUNT(*) FROM users) as 总用户, (SELECT COUNT(*) FROM tags) as 总标签, (SELECT COUNT(*) FROM tag_categories) as 分类数, (SELECT COUNT(*) FROM user_tags) as 总关系 `).get(); console.log(` • 总用户: ${stats.总用户}`); console.log(` • 总标签: ${stats.总标签}`); console.log(` • 分类数: ${stats.分类数} (从16减少到15)`); console.log(` • 总关系: ${stats.总关系}`); console.log('\n✅ 修复完成!\n'); } catch (e) { console.error('❌ 错误:', e.message); process.exit(1); } finally { db.close(); }