This commit is contained in:
58
scripts/migrate_cst_subjectid.ts
Normal file
58
scripts/migrate_cst_subjectid.ts
Normal file
@@ -0,0 +1,58 @@
|
||||
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)
|
||||
})
|
||||
Reference in New Issue
Block a user