Files
CICD/scripts/migrate_cst_subjectid.ts
SpecialX eb08c0ab68
All checks were successful
CI / build-deploy (push) Successful in 4m39s
sync-docs-and-fixes
2026-03-03 17:32:26 +08:00

59 lines
2.1 KiB
TypeScript

import { config } from "dotenv"
import { db } from "@/shared/db"
import { sql } from "drizzle-orm"
async function main() {
config()
// 1) add subject_id column if not exists (nullable first)
await db.execute(sql`ALTER TABLE class_subject_teachers ADD COLUMN IF NOT EXISTS subject_id VARCHAR(128) NULL;`)
// 2) backfill subject_id from subjects.name matching existing 'subject' column
// This assumes existing data uses subjects.name 值;若不匹配,将在 NOT NULL 约束处失败
await db.execute(sql`
UPDATE class_subject_teachers cst
JOIN subjects s ON (
s.name = cst.subject
OR s.code = CASE cst.subject
WHEN '语文' THEN 'CHINESE'
WHEN '数学' THEN 'MATH'
WHEN '英语' THEN 'ENG'
WHEN '美术' THEN 'ART'
WHEN '体育' THEN 'PE'
WHEN '科学' THEN 'SCI'
WHEN '社会' THEN 'SOC'
WHEN '音乐' THEN 'MUSIC'
ELSE NULL
END
)
SET cst.subject_id = s.id
WHERE cst.subject_id IS NULL
`)
// 3) enforce NOT NULL
await db.execute(sql`ALTER TABLE class_subject_teachers MODIFY COLUMN subject_id VARCHAR(128) NOT NULL;`)
// 4) drop old PK and create new PK (class_id, subject_id)
try { await db.execute(sql`ALTER TABLE class_subject_teachers DROP PRIMARY KEY;`) } catch {}
await db.execute(sql`ALTER TABLE class_subject_teachers ADD PRIMARY KEY (class_id, subject_id);`)
// 5) drop old subject column if exists
await db.execute(sql`ALTER TABLE class_subject_teachers DROP COLUMN IF EXISTS subject;`)
// 6) add index and FK
try { await db.execute(sql`CREATE INDEX class_subject_teachers_subject_id_idx ON class_subject_teachers (subject_id);`) } catch {}
try { await db.execute(sql`ALTER TABLE class_subject_teachers DROP FOREIGN KEY cst_s_fk;`) } catch {}
await db.execute(sql`
ALTER TABLE class_subject_teachers
ADD CONSTRAINT cst_s_fk
FOREIGN KEY (subject_id) REFERENCES subjects(id)
ON DELETE CASCADE
`)
console.log("Migration completed: class_subject_teachers now uses subject_id mapping.")
}
main().catch((err) => {
console.error(err)
process.exit(1)
})