SQL y Bases de DatosSQL en ProducciónLección 18 de 20
ORMs: Prisma y Sequelize
Un ORM (Object-Relational Mapper) convierte tablas de base de datos en objetos del lenguaje de programación. Prisma (TypeScript) y Sequelize (JavaScript) son los más populares en Node.js. Simplifican el desarrollo pero añaden una capa de abstracción sobre SQL.
-- PRISMA: schema.prisma define el modelo de datos
-- (Este es código Prisma, no SQL puro)
-- schema.prisma:
-- generator client {
-- provider = "prisma-client-js"
-- }
-- datasource db {
-- provider = "postgresql"
-- url = env("DATABASE_URL")
-- }
-- model User {
-- id Int @id @default(autoincrement())
-- email String @unique
-- nombre String
-- pedidos Order[]
-- creadoEn DateTime @default(now()) @map("creado_en")
-- @@map("users")
-- }
-- model Order {
-- id Int @id @default(autoincrement())
-- total Float
-- userId Int @map("user_id")
-- usuario User @relation(fields: [userId], references: [id])
-- }
-- Prisma genera migraciones SQL automáticamente:
-- npx prisma migrate dev --name add_users_table
-- Queries con Prisma Client (JavaScript/TypeScript):
-- const users = await prisma.user.findMany({
-- where: { pedidos: { some: { total: { gt: 100 } } } },
-- include: { pedidos: true },
-- orderBy: { creadoEn: 'desc' },
-- take: 10
-- });
-- await prisma.user.create({
-- data: { email: 'ana@test.com', nombre: 'Ana' }
-- });
-- Cuándo usar ORM vs SQL raw:
-- ORM: CRUD simple, prototipado rápido, type-safety en TypeScript
-- SQL raw: queries complejas con múltiples JOINs, window functions,
-- optimización fina, reportes de analytics
-- Prisma permite SQL raw cuando el ORM no es suficiente:
-- const result = await prisma.$queryRaw`
-- SELECT p.categoria, SUM(oi.precio * oi.cantidad) as ingresos
-- FROM order_items oi
-- JOIN products p ON p.id = oi.product_id
-- GROUP BY p.categoria
-- ORDER BY ingresos DESC
-- `;
-- Sequelize equivalente:
-- const users = await User.findAll({
-- where: { activo: true },
-- include: [{ model: Order }],
-- limit: 10
-- });
-- const raw = await sequelize.query(
-- "SELECT * FROM users WHERE salario > :minimo",
-- { replacements: { minimo: 50000 }, type: QueryTypes.SELECT }
-- );
ConsejoNo es ORM vs SQL — úsalos juntos. Usa el ORM para el 80% del CRUD rutinario y SQL raw para el 20% de consultas complejas. Prisma.$queryRaw y sequelize.query te permiten mezclar sin problema.
Practica esta lección
Resuelve los ejercicios del curso de SQL y Bases de Datos en la app, gratis y con corrección automática.
Empezar a practicar