Migraciones de bases de datos en TypeScript: revisión completa de herramientas y guía práctica
\n\nLas migraciones de bases de datos son una forma de versionar y aplicar secuencialmente cambios en el esquema de la base de datos (creación, modificación o eliminación de tablas, índices y restricciones). En el ecosistema de TypeScript existen varias herramientas potentes para gestionar migraciones. En este artículo analizaremos en detalle las tres soluciones más populares: TypeORM, Prisma y Drizzle ORM.
\n\n¿Para qué sirven las migraciones?
\nSin migraciones, los desarrolladores suelen hacer cambios manualmente a través de la consola SQL o el panel de administración, lo que provoca:
\n- \n
- Pérdida de sincronización entre el entorno de desarrollo y producción; \n
- Errores debidos al factor humano; \n
- Dificultades al revertir cambios. \n
Las migraciones resuelven estos problemas, permitiendo aplicar y revertir cambios automáticamente, así como almacenar el historial de todos los cambios del esquema en el código.
\n\n1. TypeORM — enfoque clásico con ActiveRecord y Data Mapper
\nTypeORM es uno de los ORM más maduros para TypeScript y JavaScript. Soporta tanto el patrón ActiveRecord como Data Mapper, y tiene un sistema de migraciones integrado.
\n\nInstalación y configuración
\nnpm install typeorm reflect-metadata @types/node\nnpm install pg # para PostgreSQL\n\nCree un archivo de configuración ormconfig.json o use data-source.ts:
import { DataSource } from "typeorm";\n\nexport const AppDataSource = new DataSource({\n type: "postgres",\n host: "localhost",\n port: 5432,\n username: "user",\n password: "password",\n database: "mydb",\n entities: ["src/entity/*.ts"],\n migrations: ["src/migration/*.ts"],\n synchronize: false, // desactivamos la auto-sincronización\n});\n\nCreación y ejecución de una migración
\nPrimero generamos una migración basada en los cambios en las entidades:
\nnpx typeorm migration:generate src/migration/AddUserTable -d src/data-source.ts\n\nEjemplo de migración generada:
\nimport { MigrationInterface, QueryRunner, Table } from "typeorm";\n\nexport class AddUserTable1234567890 implements MigrationInterface {\n public async up(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.createTable(\n new Table({\n name: "user",\n columns: [\n { name: "id", type: "int", isPrimary: true, isGenerated: true, generationStrategy: "increment" },\n { name: "name", type: "varchar", length: "255" },\n { name: "email", type: "varchar", isUnique: true },\n ],\n })\n );\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.dropTable("user");\n }\n}\n\nAplique la migración:
\nnpx typeorm migration:run -d src/data-source.ts\n\nVentajas y desventajas de TypeORM
\n- \n
- Ventajas: gran ecosistema, múltiples BD (PostgreSQL, MySQL, SQLite, MSSQL), generación de migraciones a partir de entidades. \n
- Desventajas: configuración compleja, velocidad lenta con muchas entidades, base de código desactualizada. \n
2. Prisma — ORM moderno con migraciones automáticas
\nPrisma es el nuevo estándar en ORM para TypeScript. Utiliza un esquema declarativo (schema.prisma) y genera migraciones automáticamente.
Instalación e inicialización
\nnpm install prisma @prisma/client\nnpx prisma init\n\nDefina el modelo en prisma/schema.prisma:
generator client {\n provider = "prisma-client-js"\n}\n\ndatasource db {\n provider = "postgresql"\n url = env("DATABASE_URL")\n}\n\nmodel User {\n id También en la biblioteca
Geolocalización y mapas en Swift: CoreLocation y MapKit para iOS/macOS
node-cache: Caché simple y eficiente en Node.js
Validación de datos en Kotlin: bibliotecas, enfoques y ejemplos de código
Trabajo con imágenes en Go (Golang): bibliotecas y ejemplos
ZXing para Kotlin: guía completa con ejemplos prácticos