ORM para JavaScript (Node.js): comparación y ejemplos
Al desarrollar la parte del servidor en Node.js, tarde o temprano surge la cuestión de la interacción con la base de datos. Escribir consultas SQL puras es una tarea laboriosa y propensa a errores. Aquí es donde ayudan los ORM (Object-Relational Mapping) — bibliotecas que permiten trabajar con las tablas de la base de datos como si fueran objetos comunes de JavaScript. En este artículo compararemos los tres ORM más populares para Node.js: Sequelize, TypeORM y Prisma, y proporcionaremos ejemplos de código ilustrativos.
1. Sequelize
Sequelize es uno de los ORM más antiguos y maduros para Node.js. Soporta PostgreSQL, MySQL, MariaDB, SQLite y Microsoft SQL Server. Sequelize utiliza un enfoque clásico con modelos y promesas (o async/await).
Instalación
npm install sequelize pg pg-hstoreEjemplo: definición de modelo y consulta
const { Sequelize, DataTypes } = require('sequelize');const sequelize = new Sequelize('database', 'user', 'password', { host: 'localhost', dialect: 'postgres'});
const User = sequelize.define('User', { name: { type: DataTypes.STRING, allowNull: false }, email: { type: DataTypes.STRING, unique: true }});
async function createUser() { await sequelize.sync(); const user = await User.create({ name: 'Iván', email: 'ivan@example.com' }); console.log(user.toJSON());}createUser();Características de Sequelize
- Madurez y una gran comunidad.
- Soporte para transacciones, migraciones y datos semilla.
- Sistema flexible de asociaciones (hasOne, hasMany, belongsToMany).
- Desventaja: sintaxis en ocasiones verbosa y depuración compleja.
2. TypeORM
TypeORM es un ORM que puede funcionar tanto con JavaScript como con TypeScript. Soporta los mismos SGBD que Sequelize y ofrece dos enfoques: Active Record y Data Mapper. TypeORM también utiliza activamente decoradores, lo que hace que el código sea más declarativo.
Instalación
npm install typeorm reflect-metadata pgEjemplo: modelo con decorador y consulta
import { Entity, PrimaryGeneratedColumn, Column, createConnection } from 'typeorm';
@Entity()class User { @PrimaryGeneratedColumn() id: number;
@Column() name: string;
@Column({ unique: true }) email: string;}
async function createUser() { const connection = await createConnection({ type: 'postgres', host: 'localhost', database: 'test', entities: [User], synchronize: true }); const user = new User(); user.name = 'María'; user.email = 'maria@example.com'; await connection.manager.save(user); console.log(user);}createUser();Características de TypeORM
- Excelente integración con TypeScript y decoradores.
- Flexibilidad: elección entre Active Record y Data Mapper.
- Soporte para migraciones, suscriptores de eventos y registro.
- Desventaja: documentación a veces incompleta, cambios disruptivos frecuentes.
3. Prisma
Prisma es un ORM moderno que difiere radicalmente de sus predecesores. En lugar de modelos en el código, describes el esquema de datos en un archivo especial schema.prisma, y Prisma genera un cliente con seguridad de tipos. Esto proporciona autocompletado en el IDE y minimiza los errores.
Instalación
npm install @prisma/clientnpx prisma initEjemplo: esquema y consulta
schema.prisma:
datasource db { provider = "postgresql" url = env("DATABASE_URL")}
model User { id Int @id @default(autoincrement()) name String email String @unique}Código JavaScript:
const { PrismaClie