> ## Documentation Index
> Fetch the complete documentation index at: https://docs.erixcel.com/llms.txt
> Use this file to discover all available pages before exploring further.

# migrate.db.ts

Aplica los archivos `.sql` de `src/db/migrations/<DB_VERSION>` en orden alfabético. Registra cada archivo aplicado en `migraciones_aplicadas` para no volver a ejecutarlo. Cada migración se ejecuta dentro de una transacción.

```typescript migrate.db.ts theme={null}
import { Pool } from 'pg';
import * as fs from 'fs';
import * as path from 'path';
import { dbConfig } from '@db/config.db';

async function migrate() {
  const pool = new Pool(dbConfig);
  const client = await pool.connect();

  try {
    console.log('🔄 Iniciando migraciones...');

    // Crear tabla de migraciones si no existe
    await client.query(`
      CREATE TABLE IF NOT EXISTS migraciones_aplicadas (
        id SERIAL PRIMARY KEY,
        nombre VARCHAR(255) NOT NULL UNIQUE,
        aplicado_en TIMESTAMP DEFAULT NOW()
      );
    `);

    // Leer archivos de migración
    const versionDir = process.env.DB_VERSION || '';
    const migrationsDir = path.join(__dirname, 'migrations', versionDir);

    if (!fs.existsSync(migrationsDir)) {
      console.error(`❌ Directorio de migraciones no encontrado: ${migrationsDir}`);
      process.exit(1);
    }

    console.log(`📂 Buscando migraciones en: migrations/${versionDir}`);

    const files = fs
      .readdirSync(migrationsDir)
      .filter((f) => f.endsWith('.sql'))
      .sort();

    console.log(`📁 Encontradas ${files.length} migraciones`);

    for (const file of files) {
      // Verificar si ya fue aplicada
      const { rows } = await client.query('SELECT 1 FROM migraciones_aplicadas WHERE nombre = $1', [file]);

      if (rows.length > 0) {
        console.log(`⏭️  Saltando (ya aplicada): ${file}`);
        continue;
      }

      // Leer y ejecutar migración
      const sqlPath = path.join(migrationsDir, file);
      const sql = fs.readFileSync(sqlPath, 'utf-8');

      console.log(`🚀 Aplicando: ${file}`);
      await client.query('BEGIN');

      try {
        await client.query(sql);
        await client.query('INSERT INTO migraciones_aplicadas (nombre) VALUES ($1)', [file]);
        await client.query('COMMIT');
        console.log(`✅ Completada: ${file}`);
      } catch (err) {
        await client.query('ROLLBACK');
        throw err;
      }
    }

    console.log('✅ Todas las migraciones completadas');
  } catch (error) {
    console.error('❌ Error en migración:', error);
    process.exit(1);
  } finally {
    client.release();
    await pool.end();
  }
}

migrate();
```

## Ejecución

```bash Terminal theme={null}
npm run db:migrate
```

**Importante:** usa nombres de archivo únicos entre versiones; el control actual almacena solo el nombre. Comprueba la existencia de la carpeta indicada en `DB_VERSION` y genera un respaldo antes de migrar.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.