fix: 启动时自动迁移缺失的数据库列

问题:旧版数据库缺少 user_id 列导致 500 错误
修复:
- init.ts 启动时自动检测并添加缺失列
- 删除 deploy/ 目录,改为手动部署
- 添加 migrate.sql 迁移脚本
- 更新 CLAUDE.md 部署说明
This commit is contained in:
2026-05-29 16:46:39 +08:00
parent 35bfe8293a
commit 9ef960321f
8 changed files with 66 additions and 172 deletions

View File

@@ -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)
}

16
server/src/db/migrate.sql Normal file
View File

@@ -0,0 +1,16 @@
-- 迁移脚本:为缺少 user_id 的表添加该列
-- 适用于旧版数据库升级
-- transactions 表添加 user_id
ALTER TABLE transactions ADD COLUMN user_id INT NOT NULL DEFAULT 1 AFTER id;
ALTER TABLE transactions ADD INDEX idx_user_date (user_id, date);
ALTER TABLE transactions ADD INDEX idx_user_type_date (user_id, type, date);
ALTER TABLE transactions ADD FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
-- budgets 表添加 user_id
ALTER TABLE budgets ADD COLUMN user_id INT NOT NULL DEFAULT 1 AFTER id;
ALTER TABLE budgets ADD UNIQUE KEY uk_user_month (user_id, month);
ALTER TABLE budgets ADD FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
-- categories 表确认 user_id 存在(旧版可能也没有)
ALTER TABLE categories ADD COLUMN IF NOT EXISTS user_id INT DEFAULT 0 COMMENT '0=默认分类, 其他=用户自定义' AFTER id;