2026-08-17 12:25:42 +08:00
|
|
|
|
const mysql = require('mysql2/promise');
|
|
|
|
|
|
(async () => {
|
2026-09-23 16:34:08 +08:00
|
|
|
|
// 🔴 口令不再内置明文(2026-09-23 入库口令处置 P2)。运行前请注入 DB_PASSWORD:
|
|
|
|
|
|
// DB_PASSWORD='<本机 DB 口令>' node add_word_cols.js
|
2026-08-17 12:25:42 +08:00
|
|
|
|
const c = await mysql.createConnection({
|
2026-09-23 16:34:08 +08:00
|
|
|
|
host: process.env.DB_HOST || 'localhost',
|
|
|
|
|
|
user: process.env.DB_USER || 'root',
|
|
|
|
|
|
password: process.env.DB_PASSWORD,
|
|
|
|
|
|
database: process.env.DB_NAME || 'competition_db',
|
2026-08-17 12:25:42 +08:00
|
|
|
|
});
|
|
|
|
|
|
try {
|
|
|
|
|
|
await c.query("ALTER TABLE exam_submissions ADD COLUMN word_file_path VARCHAR(500) NULL DEFAULT NULL COMMENT 'Word答案文件路径' AFTER answers");
|
|
|
|
|
|
console.log('Added word_file_path');
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
if (e.code === 'ER_DUP_FIELDNAME') console.log('word_file_path exists');
|
|
|
|
|
|
else throw e;
|
|
|
|
|
|
}
|
|
|
|
|
|
try {
|
|
|
|
|
|
await c.query("ALTER TABLE exam_submissions ADD COLUMN word_file_name VARCHAR(255) NULL DEFAULT NULL COMMENT 'Word答案文件名' AFTER word_file_path");
|
|
|
|
|
|
console.log('Added word_file_name');
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
if (e.code === 'ER_DUP_FIELDNAME') console.log('word_file_name exists');
|
|
|
|
|
|
else throw e;
|
|
|
|
|
|
}
|
|
|
|
|
|
const [cols] = await c.query('SHOW COLUMNS FROM exam_submissions');
|
|
|
|
|
|
cols.forEach(x => console.log(x.Field, x.Type, x.Null));
|
|
|
|
|
|
await c.end();
|
|
|
|
|
|
})();
|