Node.js y ExpressBases de Datos y APIsLección 11 de 20
Prisma ORM
Prisma es el ORM más moderno para Node.js. Te da un cliente type-safe generado desde tu schema, migraciones automáticas y una API fluida. Soporta PostgreSQL, MySQL, SQLite, MongoDB y más. El schema.prisma es la única fuente de verdad de tu base de datos.
// 1. npx prisma init (crea schema.prisma + .env)
// 2. Editar schema.prisma:
//
// generator client {
// provider = "prisma-client-js"
// }
//
// datasource db {
// provider = "postgresql"
// url = env("DATABASE_URL")
// }
//
// model Usuario {
// id Int @id @default(autoincrement())
// email String @unique
// nombre String
// rol Rol @default(USUARIO)
// tareas Tarea[]
// creadoEn DateTime @default(now())
// }
//
// model Tarea {
// id Int @id @default(autoincrement())
// titulo String
// completada Boolean @default(false)
// usuario Usuario @relation(fields: [usuarioId], references: [id])
// usuarioId Int
// }
//
// enum Rol { ADMIN USUARIO MODERADOR }
// 3. npx prisma migrate dev --name init
// 4. npx prisma generate
const { PrismaClient } = require('@prisma/client');
const db = new PrismaClient();
// CRUD con Prisma
async function ejemplos() {
// Crear
const usuario = await db.usuario.create({
data: { email: 'ana@test.com', nombre: 'Ana García' }
});
// Buscar uno (lanza si no existe)
const encontrado = await db.usuario.findUnique({
where: { email: 'ana@test.com' },
include: { tareas: true } // JOIN con tareas
});
// Listar con filtros
const usuarios = await db.usuario.findMany({
where: { rol: 'USUARIO', nombre: { contains: 'Ana' } },
orderBy: { creadoEn: 'desc' },
skip: 0,
take: 20,
});
// Actualizar
const actualizado = await db.usuario.update({
where: { id: usuario.id },
data: { nombre: 'Ana Martínez' }
});
// Upsert — crea si no existe, actualiza si existe
const upserted = await db.usuario.upsert({
where: { email: 'bot@test.com' },
create: { email: 'bot@test.com', nombre: 'Bot' },
update: { nombre: 'Bot v2' }
});
// Eliminar
await db.usuario.delete({ where: { id: usuario.id } });
}
export default db;
ConsejoExporta una única instancia de PrismaClient como singleton. Crear múltiples instancias agota el pool de conexiones. En desarrollo, usa una variable global para evitar hot-reload cree nuevas instancias.
Practica esta lección
Resuelve los ejercicios del curso de Node.js y Express en la app, gratis y con corrección automática.
Empezar a practicar