const mysql = require('mysql2/promise'); // 資料庫配置 const dbConfig = { host: process.env.DB_HOST || 'mysql.theaken.com', port: parseInt(process.env.DB_PORT || '33306'), user: process.env.DB_USER || 'AI_Platform', password: process.env.DB_PASSWORD || 'Aa123456', database: process.env.DB_NAME || 'db_AI_Platform', charset: 'utf8mb4', timezone: '+08:00' }; async function addUserFields() { console.log('🚀 開始為 users 表添加缺失的字段...'); try { const connection = await mysql.createConnection(dbConfig); console.log('✅ 資料庫連接成功'); // 檢查字段是否已存在 const [columns] = await connection.execute(` SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = ? AND TABLE_NAME = 'users' AND COLUMN_NAME IN ('phone', 'location', 'bio') `, [dbConfig.database]); const existingColumns = columns.map(col => col.COLUMN_NAME); console.log('現有字段:', existingColumns); // 添加缺失的字段 const fieldsToAdd = [ { name: 'phone', sql: 'ADD COLUMN `phone` VARCHAR(20) NULL' }, { name: 'location', sql: 'ADD COLUMN `location` VARCHAR(100) NULL' }, { name: 'bio', sql: 'ADD COLUMN `bio` TEXT NULL' } ]; for (const field of fieldsToAdd) { if (!existingColumns.includes(field.name)) { try { await connection.execute(`ALTER TABLE users ${field.sql}`); console.log(`✅ 添加字段: ${field.name}`); } catch (error) { console.log(`❌ 添加字段 ${field.name} 失敗:`, error.message); } } else { console.log(`⚠️ 字段 ${field.name} 已存在,跳過`); } } // 驗證字段添加結果 const [finalColumns] = await connection.execute(` SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = ? AND TABLE_NAME = 'users' AND COLUMN_NAME IN ('phone', 'location', 'bio') ORDER BY ORDINAL_POSITION `, [dbConfig.database]); console.log('\n📋 最終字段狀態:'); finalColumns.forEach(col => { console.log(`- ${col.COLUMN_NAME}: ${col.DATA_TYPE} (${col.IS_NULLABLE === 'YES' ? '可為空' : '不可為空'})`); }); await connection.end(); console.log('\n🎉 字段添加完成!'); } catch (error) { console.error('❌ 添加字段時發生錯誤:', error); } } addUserFields();