Migraciones de bases de datos en TypeScript: cómo gestionar el esquema sin dolor
El desarrollo con TypeScript requiere no solo una tipificación estricta del código, sino también una gestión confiable de la estructura de la base de datos. Las migraciones son una forma de versionar los cambios en el esquema de la BD, permitiendo al equipo sincronizar el estado de la base de datos con el código de la aplicación. En este artículo analizaremos las principales bibliotecas para migraciones en proyectos TypeScript, sus características y proporcionaremos ejemplos prácticos.
¿Qué son las migraciones y por qué son necesarias?
Una migración es un archivo con instrucciones que describen cambios en el esquema de la base de datos (creación, modificación o eliminación de tablas, índices, relaciones). Ventajas de usar migraciones:
- Versionado — cada cambio se registra en un archivo separado con una marca de tiempo o número.
- Reproducibilidad — se puede desplegar la base de datos desde cero en cualquier versión.
- Trabajo en equipo — todos los desarrolladores aplican los mismos cambios.
- Reversión — posibilidad de deshacer cambios fallidos.
Herramientas populares para migraciones en TypeScript
1. TypeORM
TypeORM es un ORM que funciona con TypeScript y JavaScript. Su sistema de migraciones integrado se basa en la línea de comandos.
Instalación:
npm install typeorm reflect-metadatanpm install @types/node --save-devEjemplo de generación de migración:
npx typeorm migration:create src/migration/AddUserTableEjemplo de código de migración:
import { MigrationInterface, QueryRunner, Table } from "typeorm";
export class AddUserTable1234567890123 implements MigrationInterface { public async up(queryRunner: QueryRunner): Promise<void> { await queryRunner.createTable(new Table({ name: "users", columns: [ { name: "id", type: "int", isPrimary: true, isGenerated: true, generationStrategy: "increment" }, { name: "name", type: "varchar", length: "255" }, { name: "email", type: "varchar", length: "255", isUnique: true } ] })); }
public async down(queryRunner: QueryRunner): Promise<void> { await queryRunner.dropTable("users"); }}Ejecución de migraciones:
npx typeorm migration:runVentajas: integración estrecha con TypeORM, generación automática basada en entidades.
Desventajas: puede ser lento en proyectos complejos, requiere configuración.
2. Prisma
Prisma es un ORM moderno con un potente sistema de migraciones. Utiliza un DSL declarativo (Prisma Schema Language).
Instalación:
npm install prisma @prisma/clientnpx prisma initEjemplo de esquema (schema.prisma):
model User { id Int @id @default(autoincrement()) name String email String @unique posts Post[]}
model Post { id Int @id @default(autoincrement()) title String content String? authorId Int author User @relation(fields: [authorId], references: [id])}Creación y aplicación de migración:
npx prisma migrate dev --name initPrisma crea automáticamente un archivo SQL y lo aplica a la base de datos. También se puede ver el estado:
npx prisma migrate statusVentajas: enfoque declarativo, generación automática, excelente documentación.
Desventajas: vinculado a Prisma, difícil de eludir en escenarios especiales.
3. Knex.js
Knex.js es un constructor de consultas ligero para Node.js que incluye un sistema de migraciones. Funciona con TypeScript mediante complementos.
También en la biblioteca
Contenedor de Inyección de Dependencias para Go (Golang): Wire, Dig y Uber FX
Validación de datos en Swift (iOS/macOS): herramientas y práctica
gRPC para JavaScript (Node.js): bibliotecas y ejemplos de código
Serialización de objetos en JavaScript (Node.js): guía completa