const { query } = require('./db'); const fs = require('fs'); const path = require('path'); async function runMigrations() { try { console.log('πŸ”„ λ°μ΄ν„°λ² μ΄μŠ€ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ μ‹œμž‘...'); // λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 디렉토리 확인 const migrationsDir = path.join(__dirname, 'migrations'); if (!fs.existsSync(migrationsDir)) { console.log('πŸ“ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 디렉토리가 μ—†μŠ΅λ‹ˆλ‹€. κ±΄λ„ˆλœλ‹ˆλ‹€.'); return; } // λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 파일 λͺ©λ‘ const migrationFiles = fs.readdirSync(migrationsDir) .filter(file => file.endsWith('.sql')) .sort(); if (migrationFiles.length === 0) { console.log('πŸ“„ μ‹€ν–‰ν•  λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ΄ μ—†μŠ΅λ‹ˆλ‹€.'); return; } // λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ ν…Œμ΄λΈ” 생성 await query(` CREATE TABLE IF NOT EXISTS migrations ( id SERIAL PRIMARY KEY, filename VARCHAR(255) UNIQUE NOT NULL, executed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) `); // 각 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ μ‹€ν–‰ for (const filename of migrationFiles) { // 이미 μ‹€ν–‰λœ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μΈμ§€ 확인 const existingResult = await query( 'SELECT id FROM migrations WHERE filename = $1', [filename] ); if (existingResult.rows.length > 0) { console.log(`⏭️ ${filename} - 이미 싀행됨`); continue; } console.log(`πŸ”§ ${filename} μ‹€ν–‰ 쀑...`); // λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 파일 읽기 및 μ‹€ν–‰ const migrationPath = path.join(migrationsDir, filename); const migrationSQL = fs.readFileSync(migrationPath, 'utf8'); await query(migrationSQL); // λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 기둝 await query( 'INSERT INTO migrations (filename) VALUES ($1)', [filename] ); console.log(`βœ… ${filename} μ™„λ£Œ`); } console.log('πŸŽ‰ λͺ¨λ“  λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ΄ μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€!'); } catch (error) { console.error('❌ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ μ‹€νŒ¨:', error); throw error; } } // 직접 μ‹€ν–‰ μ‹œ if (require.main === module) { runMigrations() .then(() => process.exit(0)) .catch(() => process.exit(1)); } module.exports = { runMigrations };