// 增量种子:把 extra/batch0-3.json 的补充课文写入 grammar_point(不重复,序号续接) import fs from "node:fs"; import path from "node:path"; import { sql, eq } from "drizzle-orm"; import { drizzle } from "drizzle-orm/mysql2"; import mysql from "mysql2/promise"; import { grammarPoints } from "../src/db/schema"; type Extra = { id: string; title: string; cefr: string; difficulty: number; summary: string; md: string }; const levelOf = (cefr: string) => cefr === "A1" ? { level: "starter", name: "入门" } : cefr === "A2" ? { level: "base", name: "基础" } : { level: "pro", name: "进阶" }; async function main() { const conn = await mysql.createConnection(process.env.DATABASE_URL!); const db = drizzle(conn); const [mx] = await db.select({ m: sql`COALESCE(MAX(seq),0)` }).from(grammarPoints); let seq = mx.m; const existing = new Set((await db.select({ pointId: grammarPoints.pointId }).from(grammarPoints)).map((r) => r.pointId)); let added = 0; for (const f of ["batch0.json", "batch1.json", "batch2.json", "batch3.json"]) { const p = path.join(process.cwd(), "src/content/grammar/extra", f); if (!fs.existsSync(p)) continue; const arr = JSON.parse(fs.readFileSync(p, "utf8")) as Extra[]; for (const e of arr) { if (existing.has(e.id)) continue; seq += 1; const lv = levelOf(e.cefr); await db.insert(grammarPoints).values({ pointId: e.id, level: lv.level, levelName: lv.name, title: e.title, difficulty: e.difficulty || 1, summary: e.summary, prereq: "[]", md: e.md, seq, }); added++; } } const [tot] = await db.select({ n: sql`COUNT(*)` }).from(grammarPoints); console.log("新增补充课:", added, "| 总知识点:", tot.n); await conn.end(); } main();