PostgreSQL para Devs TypeScript: Lo Esencial para tu Proyecto Next.js
Guia practica de PostgreSQL para desarrolladores TypeScript. Setup con Docker, conexion con Prisma/Drizzle, queries esenciales y tipos type-safe desde tu schema.
PostgreSQL para Devs TypeScript: Lo Esencial para tu Proyecto Next.js
PostgreSQL es la base de datos mas deseada entre desarrolladores segun el Stack Overflow Survey 2025 -- 47% quieren usarla. Y tiene sentido: es gratuita, potente, y con el ORM correcto te da tipos TypeScript automaticos desde tu schema.
Esta guia cubre lo que necesitas como dev fullstack para integrar PostgreSQL en tu proyecto Next.js. Sin teoria de DBA, sin optimizacion prematura. Lo practico.
Setup con Docker Compose
No instales PostgreSQL en tu maquina. Usa Docker y todos en tu equipo trabajan con la misma version:
# docker-compose.yml
services:
db:
image: postgres:17-alpine
ports:
- "5432:5432"
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: miapp
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:docker compose up -dListo. PostgreSQL corriendo en localhost:5432. Los datos persisten en el volumen aunque reinicies el contenedor.
Tu connection string para el .env:
DATABASE_URL="postgresql://postgres:postgres@localhost:5432/miapp"Si necesitas Docker para tu app Next.js completa, revisa la guia de Docker para Next.js donde cubrimos multi-stage build y standalone output.
Conectar con Prisma o Drizzle
Tienes dos opciones solidas. Si no sabes cual elegir, tenemos una comparativa completa de Prisma vs Drizzle.
Opcion A: Prisma
npm install prisma @prisma/client
npx prisma initDefine tu schema en prisma/schema.prisma:
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
createdAt DateTime @default(now())
}
model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
author User @relation(fields: [authorId], references: [id])
authorId Int
}npx prisma db pushPrisma genera tipos TypeScript automaticamente. Tu editor sabe exactamente que campos tiene cada modelo.
Opcion B: Drizzle
npm install drizzle-orm postgres
npm install -D drizzle-kitDefine tu schema en TypeScript directamente:
// src/db/schema.ts
import { pgTable, serial, text, boolean, timestamp, integer } from "drizzle-orm/pg-core";
export const users = pgTable("users", {
id: serial("id").primaryKey(),
email: text("email").notNull().unique(),
name: text("name"),
createdAt: timestamp("created_at").defaultNow(),
});
export const posts = pgTable("posts", {
id: serial("id").primaryKey(),
title: text("title").notNull(),
content: text("content"),
published: boolean("published").default(false),
authorId: integer("author_id").references(() => users.id),
});Con Drizzle el schema ES TypeScript, asi que los tipos ya estan ahi sin generar nada extra.
Queries esenciales
Estas son las operaciones que vas a usar el 90% del tiempo. Ejemplos con Prisma porque es el mas comun, pero Drizzle es similar.
CRUD basico
// Crear
const user = await prisma.user.create({
data: { email: "rod@ejemplo.com", name: "Rod" },
});
// Leer uno
const user = await prisma.user.findUnique({
where: { email: "rod@ejemplo.com" },
});
// Leer varios con filtro
const posts = await prisma.post.findMany({
where: { published: true },
orderBy: { createdAt: "desc" },
take: 10,
});
// Actualizar
await prisma.user.update({
where: { id: 1 },
data: { name: "Rod Alexanderson" },
});
// Eliminar
await prisma.post.delete({ where: { id: 5 } });Relaciones (JOINs)
// Traer usuario con sus posts (JOIN automatico)
const userWithPosts = await prisma.user.findUnique({
where: { id: 1 },
include: { posts: true },
});
// Traer posts con datos del autor
const posts = await prisma.post.findMany({
where: { published: true },
include: {
author: { select: { name: true, email: true } },
},
});Filtros comunes
// Busqueda parcial (LIKE)
const results = await prisma.post.findMany({
where: { title: { contains: "nextjs", mode: "insensitive" } },
});
// Multiples condiciones
const results = await prisma.post.findMany({
where: {
AND: [
{ published: true },
{ createdAt: { gte: new Date("2026-01-01") } },
],
},
});Todo esto es type-safe. Si escribes mal un campo, TypeScript te avisa antes de correr el codigo.
Tipos type-safe desde tu schema
Esta es la parte donde PostgreSQL + TypeScript brillan juntos. Con Prisma, despues de definir tu schema, corres:
npx prisma generateEsto genera tipos que puedes importar en cualquier parte:
import type { User, Post } from "@prisma/client";
// TypeScript sabe exactamente que tiene User
function formatUser(user: User): string {
return `${user.name} (${user.email})`;
}Con Drizzle es aun mas directo porque el schema ya es TypeScript:
import type { InferSelectModel } from "drizzle-orm";
import { users } from "./schema";
type User = InferSelectModel<typeof users>;En ambos casos, si cambias tu schema de base de datos, los tipos se actualizan y TypeScript te marca todos los lugares donde necesitas ajustar tu codigo. Zero sorpresas en runtime.
Siguiente paso
Si tu proyecto necesita autenticacion, revisa la guia de Auth.js v5 con Next.js que usa PostgreSQL como adapter. Y si quieres una alternativa hosted que incluye PostgreSQL + auth + storage, la guia de Supabase con Next.js cubre todo el setup.
Preguntas frecuentes
Cual es la mejor forma de conectar PostgreSQL con Next.js?
Usa un ORM como Prisma o Drizzle. Prisma es mas facil de aprender y tiene mejor documentacion. Drizzle es mas ligero y te da mas control sobre las queries. Ambos generan tipos TypeScript automaticamente desde tu schema.
Necesito saber SQL para usar PostgreSQL con TypeScript?
Lo basico si: SELECT, INSERT, UPDATE, DELETE, JOINs y filtros con WHERE. Un ORM te abstrae mucho, pero entender que pasa por debajo te ayuda a debuggear y optimizar cuando algo es lento.
Como levanto PostgreSQL para desarrollo local?
Con Docker Compose. Un archivo de 10 lineas te levanta PostgreSQL con datos persistentes. No necesitas instalar nada en tu maquina, y todos en tu equipo usan la misma version.
Prisma o Drizzle para PostgreSQL?
Prisma si quieres algo que funcione rapido con buena documentacion y migraciones automaticas. Drizzle si prefieres queries mas cercanas a SQL y un bundle mas liviano. Tenemos una comparativa detallada en el blog.
Articulos relacionados
Next.js 16: Guia de Migracion y Novedades
Migra tu proyecto de Next.js 15 a 16. Novedades principales, breaking changes, y pasos para actualizar sin romper tu app.
Testing en Next.js con Vitest y Playwright
Configura testing en tu proyecto Next.js. Unit tests con Vitest, E2E con Playwright, y como integrarlos en tu pipeline de CI/CD.
Tailwind CSS 4: Migracion desde v3
Migra tu proyecto de Tailwind CSS 3 a 4. Cambios principales, nuevo sistema de configuracion, CSS-first config y como actualizar sin romper tu app.