59 lines
2.1 KiB
TypeScript
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)
|
|
})
|