Ir al contenido
angel.library

Prisma + Express

Ventana de terminal
pnpm add express
pnpm add -D prisma
pnpm add @prisma/client
pnpm dlx prisma init

Esto crea prisma/schema.prisma y un .env con DATABASE_URL de ejemplo.

prisma/schema.prisma
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»
.env
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:

Ventana de terminal
docker run --name postgres-dev -e POSTGRES_PASSWORD=password -p 5432:5432 -d postgres
Ventana de terminal
pnpm dlx prisma migrate dev --name init

Esto crea la tabla Post en la base y genera el client con los tipos correspondientes.

lib/prisma.ts
import { PrismaClient } from "@prisma/client"
export const prisma = new PrismaClient()
app.ts
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"))
Ventana de terminal
curl -X POST http://localhost:3000/posts \
-H "Content-Type: application/json" \
-d '{"title": "Mi primer post"}'
curl http://localhost:3000/posts

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.

  • npx prisma migrate dev no es el comando de producción — en un deploy real se usa npx 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.