自動放寬舊資料表過小的欄位,修正上傳失敗

根本原因:
badminton 資料表是舊系統先建立的,battlecombination 欄位型別比 TEXT 小;ensureTable 的 CREATE TABLE IF NOT EXISTS 對已存在的資料表不會生效,跨區平衡後 6 隊 × 3 輪的 JSON 超過欄位長度,寫入時噴出「Data too long for column 'battlecombination'」。

影響:
- server 啟動後第一次資料庫操作會自動把 personnel 與 battlecombination 放寬成 TEXT,不需手動下 SQL
- ensureTable 加上 tableReady 旗標,每個 process 只檢查一次,不再每個 request 都跑 CREATE TABLE

修法:
新增 widenLegacyColumns 查詢 information_schema,欄位型別不是 TEXT 系列時執行 ALTER TABLE MODIFY 放寬,並以模組層旗標記憶檢查結果。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-10 15:22:35 +08:00
co-authored by Claude Fable 5
parent 8cc05183f7
commit db67c19e85
+34
View File
@@ -240,7 +240,13 @@ app.listen(port, () => {
} }
}) })
let tableReady = false
async function ensureTable(poolInstance, currentTableName) { async function ensureTable(poolInstance, currentTableName) {
if (tableReady) {
return
}
await poolInstance.execute(` await poolInstance.execute(`
CREATE TABLE IF NOT EXISTS \`${currentTableName}\` ( CREATE TABLE IF NOT EXISTS \`${currentTableName}\` (
time INT(11) NOT NULL, time INT(11) NOT NULL,
@@ -249,6 +255,34 @@ async function ensureTable(poolInstance, currentTableName) {
PRIMARY KEY (time) PRIMARY KEY (time)
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
`) `)
await widenLegacyColumns(poolInstance, currentTableName)
tableReady = true
}
async function widenLegacyColumns(poolInstance, currentTableName) {
const [columns] = await poolInstance.execute(
`
SELECT COLUMN_NAME AS name, DATA_TYPE AS type
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = ?
AND COLUMN_NAME IN ('personnel', 'battlecombination')
`,
[currentTableName],
)
for (const column of columns) {
if (['text', 'mediumtext', 'longtext'].includes(String(column.type).toLowerCase())) {
continue
}
const nullability = column.name === 'personnel' ? 'NOT NULL' : 'DEFAULT NULL'
await poolInstance.execute(
`ALTER TABLE \`${currentTableName}\` MODIFY \`${column.name}\` TEXT ${nullability}`,
)
console.log(`widened column ${column.name} to TEXT on \`${currentTableName}\``)
}
} }
function buildLineFlexMessage(time, rounds) { function buildLineFlexMessage(time, rounds) {