guias·8 min de lectura

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:

yaml
# 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:
bash
docker compose up -d

Listo. PostgreSQL corriendo en localhost:5432. Los datos persisten en el volumen aunque reinicies el contenedor.

Tu connection string para el .env:

bash
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

bash
npm install prisma @prisma/client
npx prisma init

Define tu schema en prisma/schema.prisma:

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
}
bash
npx prisma db push

Prisma genera tipos TypeScript automaticamente. Tu editor sabe exactamente que campos tiene cada modelo.

Opcion B: Drizzle

bash
npm install drizzle-orm postgres
npm install -D drizzle-kit

Define tu schema en TypeScript directamente:

typescript
// 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

typescript
// 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)

typescript
// 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

typescript
// 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:

bash
npx prisma generate

Esto genera tipos que puedes importar en cualquier parte:

typescript
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:

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.

#postgresql#typescript#nextjs#prisma#drizzle#base-de-datos

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.