Migraciones de bases de datos en TypeScript: TypeORM, Prisma y Drizzle

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Migraciones de bases de datos en TypeScript: revisión completa de herramientas y guía práctica

\n\n

Las 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?

\n

Sin 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
\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\n

1. TypeORM — enfoque clásico con ActiveRecord y Data Mapper

\n

TypeORM 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\n

Instalación y configuración

\n
npm install typeorm reflect-metadata @types/node\nnpm install pg  # para PostgreSQL
\n\n

Cree un archivo de configuración ormconfig.json o use data-source.ts:

\n
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\n

Creación y ejecución de una migración

\n

Primero generamos una migración basada en los cambios en las entidades:

\n
npx typeorm migration:generate src/migration/AddUserTable -d src/data-source.ts
\n\n

Ejemplo de migración generada:

\n
import { 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\n

Aplique la migración:

\n
npx typeorm migration:run -d src/data-source.ts
\n\n

Ventajas 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
\n\n

2. Prisma — ORM moderno con migraciones automáticas

\n

Prisma es el nuevo estándar en ORM para TypeScript. Utiliza un esquema declarativo (schema.prisma) y genera migraciones automáticamente.

\n\n

Instalación e inicialización

\n
npm install prisma @prisma/client\nnpx prisma init
\n\n

Defina el modelo en prisma/schema.prisma:

\n
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                    

Recommendations