ORM para TypeScript: Comparación y ejemplos de uso
En el desarrollo moderno con TypeScript, elegir el ORM (Object-Relational Mapping) correcto es una decisión fundamental que afecta el rendimiento, la legibilidad del código y la velocidad de desarrollo. En este artículo, compararemos en detalle los tres ORM más populares para TypeScript: Prisma, TypeORM y MikroORM. Conocerás sus fortalezas y debilidades, verás ejemplos de código y obtendrás recomendaciones prácticas para tu proyecto.
1. Prisma — el estándar moderno
Prisma es un ORM de nueva generación que utiliza su propio lenguaje de esquema declarativo. Genera automáticamente un cliente con seguridad de tipos basado en el esquema de tu base de datos. Prisma es compatible con PostgreSQL, MySQL, SQLite, SQL Server y MongoDB.
Ventajas:
- Potente sistema de tipos: todas las consultas se verifican en tiempo de compilación
- Migraciones integradas y editor visual Prisma Studio
- Documentación excelente y comunidad activa
- Autocompletado en el IDE
Desventajas:
- Paso adicional de generación del cliente
- Menos flexibilidad para consultas SQL complejas
- Tamaño del paquete relativamente grande
Ejemplo de código:
// schema.prismamodel User { id Int @id @default(autoincrement()) email String @unique name String? posts Post[]}
model Post { id Int @id @default(autoincrement()) title String content String? authorId Int author User @relation(fields: [authorId], references: [id])}// app.tsimport { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
async function main() { // Crear usuario con publicación const user = await prisma.user.create({ data: { email: 'alice@example.com', name: 'Alice', posts: { create: { title: 'Hello World' } } }, include: { posts: true } });
// Búsqueda con filtrado const users = await prisma.user.findMany({ where: { email: { contains: 'alice' } }, orderBy: { name: 'asc' } });
console.log(users);}
main();2. TypeORM — el veterano probado
TypeORM es uno de los ORM más antiguos para TypeScript, inspirado en Hibernate y Entity Framework. Utiliza decoradores para definir entidades y admite los patrones Active Record y Data Mapper. Funciona con la mayoría de las bases de datos relacionales.
Ventajas:
- Sistema flexible de decoradores
- Soporte para migraciones y sincronización de esquemas
- Gran cantidad de integraciones y extensiones
- Proyecto maduro y probado a lo largo del tiempo
Desventajas:
- Tipado menos estricto en comparación con Prisma
- Configuración compleja para principiantes
- Desarrollo lento en los últimos tiempos
Ejemplo de código:
// entity/User.tsimport { Entity, PrimaryGeneratedColumn, Column, OneToMany } from 'typeorm';import { Post } from './Post';
@Entity()export class User { @PrimaryGeneratedColumn() id: number;
@Column({ unique: true }) email: string;
@Column({ nullable: true }) name: string;
@OneToMany(() => Post, (post) => post.author) posts: Post[];}// app.tsimport { createConnection } from 'typeorm';import { User } from './entity/User';
async function main() { const connection = await createConnection(); const userRepo = connection.getRepository(User);
// Creación const user = userRepo.create({ email: 'bob@example.com', name: 'Bob' }); await userRepo.save(user);
// Búsqueda const users = await userRepo.find({ where: { name: Like('%Bob%') }, relations: ['posts'] });
console.log(users);}
main();3
También en la biblioteca
node-cron: Planificador de tareas JavaScript
Socket.io para JavaScript (Node.js): guía completa con ejemplos
Validación de datos en C++: bibliotecas, patrones y ejemplos de código