Prisma + Express
Paso 1: instalar y arrancar Prisma
Sección titulada «Paso 1: instalar y arrancar Prisma»pnpm add expresspnpm add -D prismapnpm add @prisma/clientpnpm dlx prisma initbun add expressbun add -d prismabun add @prisma/clientbunx prisma initnpm install expressnpm install -D prismanpm install @prisma/clientnpx prisma initEsto crea prisma/schema.prisma y un .env con DATABASE_URL de ejemplo.
Paso 2: definir el modelo
Sección titulada «Paso 2: definir el modelo»datasource db { provider = "postgresql" url = env("DATABASE_URL")}
generator client { provider = "prisma-client-js"}
model Post { id String @id @default(cuid()) title String content String? createdAt DateTime @default(now())}Paso 3: apuntar DATABASE_URL a una base real
Sección titulada «Paso 3: apuntar DATABASE_URL a una base real»DATABASE_URL="postgresql://usuario:password@localhost:5432/miapp"Para desarrollo local rápido sin instalar Postgres a mano, un contenedor Docker de un solo comando alcanza:
docker run --name postgres-dev -e POSTGRES_PASSWORD=password -p 5432:5432 -d postgresPaso 4: migrar
Sección titulada «Paso 4: migrar»pnpm dlx prisma migrate dev --name initbunx prisma migrate dev --name initnpx prisma migrate dev --name initEsto crea la tabla Post en la base y genera el client con los tipos correspondientes.
Paso 5: el client como singleton
Sección titulada «Paso 5: el client como singleton»import { PrismaClient } from "@prisma/client"
export const prisma = new PrismaClient()Paso 6: un endpoint real
Sección titulada «Paso 6: un endpoint real»import express from "express"import { prisma } from "./lib/prisma"
const app = express()app.use(express.json())
app.get("/posts", async (req, res) => { const posts = await prisma.post.findMany() res.json(posts)})
app.post("/posts", async (req, res) => { const post = await prisma.post.create({ data: req.body }) res.status(201).json(post)})
app.listen(3000, () => console.log("http://localhost:3000"))Paso 7: probar
Sección titulada «Paso 7: probar»curl -X POST http://localhost:3000/posts \ -H "Content-Type: application/json" \ -d '{"title": "Mi primer post"}'
curl http://localhost:3000/postsSiguiente paso natural
Sección titulada «Siguiente paso natural»Esta versión no valida el body ni maneja errores — el siguiente paso natural es aplicar el patrón completo de CRUD completo (validación con Zod, status codes correctos, error handler) sobre esta misma base.
Consideraciones
Sección titulada «Consideraciones»npx prisma migrate devno es el comando de producción — en un deploy real se usanpx prisma migrate deploy, que aplica migraciones existentes sin generar nuevas interactivamente (ver Prisma en Express).- El contenedor Docker de este ejemplo es solo para desarrollo local — nunca usar esa contraseña (
password) hardcodeada fuera de un entorno de prueba descartable.