fix: 启动时自动迁移缺失的数据库列
问题:旧版数据库缺少 user_id 列导致 500 错误 修复: - init.ts 启动时自动检测并添加缺失列 - 删除 deploy/ 目录,改为手动部署 - 添加 migrate.sql 迁移脚本 - 更新 CLAUDE.md 部署说明
This commit is contained in:
@@ -3,6 +3,31 @@ import pool from './connection'
|
||||
import { readFileSync } from 'fs'
|
||||
import { join } from 'path'
|
||||
|
||||
async function columnExists(conn: mysql.Connection, table: string, column: string): Promise<boolean> {
|
||||
const [rows] = await conn.query(
|
||||
`SELECT COUNT(*) as cnt FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?`,
|
||||
[table, column]
|
||||
)
|
||||
return (rows as any[])[0].cnt > 0
|
||||
}
|
||||
|
||||
async function runMigrations(conn: mysql.Connection) {
|
||||
// transactions 表添加 user_id
|
||||
if (!await columnExists(conn, 'transactions', 'user_id')) {
|
||||
console.log('[DB] Migrating: adding user_id to transactions')
|
||||
await conn.query('ALTER TABLE transactions ADD COLUMN user_id INT NOT NULL DEFAULT 1 AFTER id')
|
||||
await conn.query('ALTER TABLE transactions ADD INDEX idx_user_date (user_id, date)')
|
||||
await conn.query('ALTER TABLE transactions ADD INDEX idx_user_type_date (user_id, type, date)')
|
||||
}
|
||||
|
||||
// budgets 表添加 user_id
|
||||
if (!await columnExists(conn, 'budgets', 'user_id')) {
|
||||
console.log('[DB] Migrating: adding user_id to budgets')
|
||||
await conn.query('ALTER TABLE budgets ADD COLUMN user_id INT NOT NULL DEFAULT 1 AFTER id')
|
||||
await conn.query('ALTER TABLE budgets ADD UNIQUE KEY uk_user_month (user_id, month)')
|
||||
}
|
||||
}
|
||||
|
||||
export async function initDatabase() {
|
||||
const dbName = process.env.DB_NAME || 'xiaocai'
|
||||
|
||||
@@ -38,10 +63,14 @@ export async function initDatabase() {
|
||||
const seed = readFileSync(seedPath, 'utf-8')
|
||||
await initConn.query(seed)
|
||||
|
||||
// 运行迁移(添加缺失列)
|
||||
await runMigrations(initConn)
|
||||
|
||||
console.log('[DB] Database initialized')
|
||||
} catch (err: any) {
|
||||
if (err.code === 'ER_DUP_ENTRY' || err.errno === 1062) {
|
||||
console.log('[DB] Already initialized, skipping seed')
|
||||
await runMigrations(initConn)
|
||||
} else {
|
||||
console.error('[DB] Init failed:', err.message)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user