import { PrismaClient } from "@prisma/client"; import { PrismaMariaDb } from "@prisma/adapter-mariadb"; import "dotenv/config"; const base = (process.env.DATABASE_URL || "mysql://localhost:3306/zhuiguang_ai?charset=utf8mb4").replace("mysql://", "mariadb://"); const sep = base.includes("?") ? "&" : "?"; const connectionString = `${base}${sep}connection_limit=20&pool_timeout=30`; const adapter = new PrismaMariaDb(connectionString); const prisma = new PrismaClient({ adapter }); const NON_AI_PATTERNS = [ "book", "guide", "tutorial", "awesome", "interview", "notes", "handbook", "cheatsheet", "cheat-sheet", "roadmap", "everything you need to know", "StableDiffusionBook", "Claude-Code-Everything-You-Need-to-Know", "Snailclimb/JavaGuide", "pathwaycom/pathway", "Shubhamsaboo/awesome-llm-apps", ]; async function main() { console.log("🧹 清理误入库的非AI技能数据\n"); const skills = await prisma.skill.findMany({ select: { id: true, name: true, sourceUrl: true, status: true }, }); let cleaned = 0; for (const skill of skills) { const name = skill.name.toLowerCase(); const isNonAI = NON_AI_PATTERNS.some((p) => name.includes(p.toLowerCase())); if (isNonAI && skill.status === "draft") { await prisma.skillReview.deleteMany({ where: { skillId: skill.id } }); await prisma.reviewGenerationLog.deleteMany({ where: { skillId: skill.id } }); await prisma.skill.delete({ where: { id: skill.id } }); console.log(`🗑️ 已删除: ${skill.name}`); cleaned++; } else if (isNonAI) { await prisma.skill.update({ where: { id: skill.id }, data: { status: "draft" }, }); console.log(`📝 已标记为draft: ${skill.name}`); cleaned++; } } if (cleaned === 0) console.log("✅ 没有需要清理的误入数据"); else console.log(`\n✅ 已清理 ${cleaned} 条数据`); } main() .catch((e) => { console.error("💥 清理失败:", e.message); process.exit(1); }) .finally(() => prisma.$disconnect());