ORM para TypeScript: comparación y ejemplos
En el desarrollo web moderno con TypeScript, elegir el ORM (Object-Relational Mapping) correcto es una de las decisiones clave que afecta la arquitectura, el rendimiento y la facilidad de mantenimiento del proyecto. Un ORM permite trabajar con la base de datos a través de objetos del lenguaje de programación, abstrayendo las consultas SQL. En este artículo, analizaremos los tres ORM más populares para TypeScript: TypeORM, Prisma y MikroORM. Conocerás sus fortalezas y debilidades, y también verás ejemplos de código para cada uno.
1. TypeORM
TypeORM es uno de los ORM más antiguos y maduros para TypeScript y JavaScript. Soporta los patrones Active Record y Data Mapper, así como múltiples bases de datos: PostgreSQL, MySQL, SQLite, MongoDB y otras.
Características de TypeORM:
- Soporte para decoradores en la definición de entidades
- Relaciones flexibles: OneToOne, OneToMany, ManyToMany
- Migraciones y sincronización de esquemas
- Soporte para suscripciones y eventos del ciclo de vida
- Query Builder para consultas complejas
Ejemplo de código con TypeORM:
import { Entity, PrimaryGeneratedColumn, Column, BaseEntity, createConnection } from "typeorm";
@Entity()export class User extends BaseEntity { @PrimaryGeneratedColumn() id: number;
@Column() name: string;
@Column() email: string;}
async function main() { await createConnection({ type: "postgres", host: "localhost", port: 5432, username: "test", password: "test", database: "test", entities: [User], synchronize: true, });
const user = new User(); user.name = "Iván"; user.email = "ivan@example.com"; await user.save();
const users = await User.find(); console.log(users);}Ventajas: gran comunidad, muchos tutoriales, soporte para MongoDB. Desventajas: configuración compleja, problemas con lazy loading, API a veces poco intuitiva.
2. Prisma
Prisma es un ORM moderno que replantea el enfoque para trabajar con bases de datos. En lugar de un ORM tradicional, ofrece tres componentes: Prisma Client (cliente tipado seguro generado automáticamente), Prisma Migrate (sistema de migraciones) y Prisma Studio (interfaz gráfica).
Características de Prisma:
- Esquema de datos declarativo (schema.prisma)
- Tipado completo basado en el esquema: sin tipos manuales
- Generación automática del cliente
- Soporte para transacciones y paginación
- Integración con GraphQL (Nexus, TypeGraphQL)
Ejemplo de código con Prisma:
// schema.prismamodel 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])}
// main.tsimport { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
async function main() { const user = await prisma.user.create({ data: { name: 'María', email: 'maria@example.com', posts: { create: { title: 'Mi primer post' } } }, include: { posts: true } });
const users = await prisma.user.findMany({ include: { posts: true } }); console.log(users);}
main() .catch(e => console.error(e)) .finally(() => prisma.$disconnect());Ventajas: la mejor tipificación de su clase, sintaxis simple, documentación excelente. Desventajas: dependencia del esquema, complejidad con consultas personalizadas, mayor consumo de memoria.
3. MikroORM
MikroORM es un micro-ORM inspirado en Doctrine