import mysql from 'mysql2/promise'; import { readFileSync } from 'fs'; import { fileURLToPath } from 'url'; import { dirname, join } from 'path'; const __dirname = dirname(fileURLToPath(import.meta.url)); async function main() { const conn = await mysql.createConnection(process.env.DATABASE_URL); try { // Read the migration SQL const sql = readFileSync(join(__dirname, '../drizzle/0001_secret_guardian.sql'), 'utf8'); // Split by statement-breakpoint and execute each statement const statements = sql .split('--> statement-breakpoint') .map(s => s.trim()) .filter(s => s.length > 0); console.log(`Executing ${statements.length} statements...`); for (const stmt of statements) { try { await conn.query(stmt); console.log('✓', stmt.slice(0, 60).replace(/\n/g, ' ')); } catch (e) { if (e.code === 'ER_TABLE_EXISTS_ERROR' || e.message.includes('already exists')) { console.log('⚠ Already exists (skipping):', stmt.slice(0, 60).replace(/\n/g, ' ')); } else { console.error('✗ Error:', e.message, '\nSQL:', stmt.slice(0, 100)); } } } // Mark migration as applied try { await conn.query( 'INSERT IGNORE INTO __drizzle_migrations (hash, created_at) VALUES (?, ?)', ['0001_secret_guardian_hash', Date.now()] ); console.log('✓ Migration marked as applied'); } catch (e) { console.log('Migration tracking:', e.message); } // Verify tables const [tables] = await conn.query('SHOW TABLES'); console.log('\nAll tables:', tables.map(t => Object.values(t)[0])); } finally { await conn.end(); } } main().catch(console.error);