Si ya aprendiste lo básico de SQL y quieres una base de datos real para practicar, PostgreSQL es uno de los mejores lugares para empezar. Es gratuito, de código abierto y lo usan tanto startups como grandes empresas. Además sigue de cerca el estándar SQL, así que lo que aprendas aquí te sirve en otras bases de datos.

PostgreSQL (a menudo llamado “Postgres”) es un sistema de administración de bases de datos relacionales. Eso significa que guarda los datos en tablas formadas por filas y columnas, relaciona esas tablas entre sí y te permite hacerle preguntas a los datos con SQL. Un sistema de administración de bases de datos, o DBMS, es el software que se encarga de lo difícil por ti: guardar los datos de forma segura, controlar quién puede verlos y responder consultas con rapidez.

Esta guía recorre el flujo de trabajo para principiantes al administrar una base de datos. Instalarás PostgreSQL, te conectarás, crearás una base de datos y tablas, agregarás algunos datos, configurarás un usuario limitado y respaldarás y restaurarás todo. Todos los ejemplos usan una pequeña base de datos de una librería, así que cada paso se apoya en el anterior.

Al terminar, tendrás:

  • Un servidor de PostgreSQL funcionando en tu computadora
  • Una base de datos bookstore con dos tablas relacionadas y datos de ejemplo
  • Un usuario limitado con el que una aplicación podría conectarse de forma segura
  • Un archivo de respaldo y la prueba de que puedes restaurarlo

¿Por Qué Usar PostgreSQL?

PostgreSQL es una gran opción para tu primera base de datos seria porque:

  • Es gratuito y de código abierto. No hay cuotas de licencia y una gran comunidad lo mantiene.
  • Sigue el estándar SQL. Las habilidades que desarrolles aquí también ayudan con MySQL, SQL Server y otras.
  • Protege tus datos. Admite transacciones completas, de modo que un grupo de cambios o se aplica por completo o no se aplica.
  • Maneja cargas de trabajo reales. Impulsa desde pequeñas aplicaciones web hasta grandes sistemas de análisis.
  • Tiene funciones avanzadas. Incluye tipos de datos avanzados como JSON, arreglos y fechas con zona horaria, para que puedas crecer hacia ellos más adelante.

Lo que Necesitas Antes de Empezar

  • Una computadora con Windows, macOS o Linux
  • Una terminal (Símbolo del sistema, PowerShell, Terminal o cualquier shell)
  • Unos 45 minutos

No necesitas saber programar. Si SQL es nuevo para ti, conviene leer Los JOINs de SQL Explicados: Guía para Principiantes junto con esta guía.

Cómo Está Organizado PostgreSQL

Antes de instalar nada, conviene saber cómo encajan las piezas. Los principiantes suelen confundirlas:

NivelQué esEjemplo
ServidorEl programa de PostgreSQL en ejecución. Una computadora puede ejecutar varios.El servicio que escucha en el puerto 5432
Base de datosUna colección de datos separada dentro del servidor.bookstore
EsquemaUna carpeta de tablas dentro de una base de datos. Toda base de datos empieza con uno llamado public.public
TablaFilas y columnas de datos.books

Así que el nombre completo de una tabla es en realidad base_de_datos.esquema.tabla, aunque normalmente solo escribes el nombre de la tabla. Los usuarios (llamados roles) pertenecen a todo el servidor, no a una sola base de datos, y por eso les das acceso a cada base de datos por separado.

Paso 1: Instala PostgreSQL

Elige la opción que corresponda a tu computadora. PostgreSQL lanza una versión mayor nueva cada año, y las versiones antiguas dejan de recibir correcciones después de cinco años. Los pasos de abajo funcionan en cualquier versión actual. Puedes consultar qué versiones tienen soporte en la página de versiones de PostgreSQL.

Windows

  1. Descarga el instalador de la página oficial de descargas de PostgreSQL.
  2. Ejecútalo y conserva los componentes predeterminados. Incluye el servidor, pgAdmin (una herramienta gráfica) y las herramientas de línea de comandos.
  3. Cuando se te pida, establece una contraseña para el usuario postgres. Es la cuenta principal de administrador, así que anota la contraseña.
  4. Conserva el puerto predeterminado, 5432.

Al terminar, busca SQL Shell (psql) en el menú Inicio. Si más adelante psql no se reconoce en una terminal normal, consulta la tabla de solución de problemas cerca del final de esta guía.

macOS

Con Homebrew, instala una versión actual e inícialo como servicio en segundo plano:

brew install postgresql@17
brew services start postgresql@17

Importante para usuarios de Mac: Homebrew crea la cuenta de administrador con tu nombre de usuario de Mac, no con postgres, y no le asigna contraseña. Esto significa que en tu máquina no existe un usuario llamado postgres. Es normal. En los pasos de abajo, usa los comandos de macOS que se muestran en lugar de los que llevan -U postgres.

Ubuntu o Debian Linux

sudo apt update
sudo apt install postgresql

En Ubuntu, el instalador crea la cuenta postgres e inicia el servicio por ti. Esa cuenta no tiene contraseña de forma predeterminada. Accedes a ella con sudo, como se muestra en el siguiente paso.

Con Docker

Si prefieres no instalar nada en tu computadora, puedes ejecutar PostgreSQL en un contenedor. Mi guía de Docker para principiantes explica lo básico, y los pasos son parecidos a los de mi guía para ejecutar MySQL en Docker:

docker run --name my-postgres \
  -e POSTGRES_PASSWORD=change-me \
  -p 5432:5432 \
  -v pgdata:/var/lib/postgresql/data \
  -d postgres:17

La línea -v pgdata:... guarda tus datos en un volumen de Docker, para que sobrevivan si eliminas el contenedor.

Comprueba la Instalación

En una instalación nativa, confirma que las herramientas estén disponibles:

psql --version

Deberías ver un número de versión como psql (PostgreSQL) 17.x.

Paso 2: Conéctate con psql

psql es el cliente de línea de comandos de PostgreSQL. Se instala junto con el servidor. Como cada sistema configura la cuenta de administrador de una forma un poco distinta, usa la fila que corresponda a tu configuración:

Tu configuraciónConéctate como administrador
Windowspsql -U postgres -h localhost
macOS (Homebrew)psql postgres
Ubuntu o Debiansudo -u postgres psql
Dockerdocker exec -it my-postgres psql -U postgres

En Windows se te pedirá la contraseña que estableciste durante la instalación.

Verás un prompt como postgres=# (o tunombre=# en una Mac). El # significa que estás conectado como superusuario. Los comandos que empiezan con una diagonal inversa, como \l, son atajos de psql y no SQL. Toda instrucción SQL debe terminar con punto y coma.

Estos son los atajos que más usarás:

ComandoQué hace
\lLista todas las bases de datos
\c dbnameSe conecta a una base de datos
\dtLista las tablas de la base de datos actual
\d tablenameDescribe las columnas y restricciones de una tabla
\duLista los usuarios (llamados roles)
\xCambia a un formato vertical para resultados anchos
\qSale de psql

Paso 3: Crea una Base de Datos

Un solo servidor de PostgreSQL puede contener muchas bases de datos. Crea una para la librería y conéctate a ella:

CREATE DATABASE bookstore;
\c bookstore

El prompt ahora dice bookstore=#, así que todo lo que ejecutes a continuación ocurre dentro de esta base de datos.

Paso 4: Crea Tablas

Las tablas guardan tus datos. Antes de escribir SQL, decide qué guardar y cómo se relacionan las piezas. Si quieres profundizar en esto, lee Diseño de Bases de Datos: Guía para Principiantes para Planearlo Bien.

Nuestra librería tiene autores y libros. Un autor puede escribir muchos libros, así que cada libro apunta de vuelta a su autor.

CREATE TABLE authors (
    author_id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    name      TEXT NOT NULL,
    country   TEXT
);

CREATE TABLE books (
    book_id        INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    title          TEXT NOT NULL,
    author_id      INTEGER NOT NULL REFERENCES authors (author_id),
    price          NUMERIC(8, 2) NOT NULL CHECK (price >= 0),
    published_year SMALLINT,
    in_stock       BOOLEAN NOT NULL DEFAULT TRUE,
    added_at       TIMESTAMPTZ NOT NULL DEFAULT now()
);

Esto es lo que hace cada parte:

  • GENERATED ALWAYS AS IDENTITY hace que PostgreSQL numere las filas por ti (1, 2, 3, etc.).
  • PRIMARY KEY identifica de forma única cada fila.
  • NOT NULL significa que la columna no puede quedar vacía.
  • REFERENCES authors (author_id) es una clave foránea. PostgreSQL rechazará un libro cuyo autor no exista.
  • CHECK (price >= 0) bloquea los precios negativos.
  • DEFAULT completa un valor cuando no lo proporcionas.

Tipos de Datos Comunes

TipoÚsalo para
INTEGER, SMALLINT, BIGINTNúmeros enteros
NUMERIC(8, 2)Decimales exactos, como dinero
TEXT, VARCHAR(n)Texto
BOOLEANVerdadero o falso
DATE, TIMESTAMPTZFechas, y fecha con hora y zona horaria

Usa NUMERIC para el dinero, nunca FLOAT. Los números de punto flotante pueden introducir pequeños errores de redondeo.

Revisa tu trabajo con \dt y \d books.

Paso 5: Agrega Datos

Inserta primero los autores, porque los libros hacen referencia a ellos:

INSERT INTO authors (name, country) VALUES
    ('Octavia Butler', 'United States'),
    ('Gabriel García Márquez', 'Colombia'),
    ('Chinua Achebe', 'Nigeria');

INSERT INTO books (title, author_id, price, published_year, in_stock) VALUES
    ('Kindred', 1, 14.99, 1979, TRUE),
    ('Parable of the Sower', 1, 16.50, 1993, TRUE),
    ('One Hundred Years of Solitude', 2, 18.00, 1967, TRUE),
    ('Things Fall Apart', 3, 12.95, 1958, FALSE);

Los valores de author_id (1, 2 y 3) coinciden con los números que PostgreSQL generó para los autores, en el orden en que los insertaste.

Comprueba que los datos estén ahí:

SELECT * FROM books;

Deberías ver cuatro filas. Esta guía se enfoca en administrar la base de datos, así que mantiene las consultas cortas. Cuando estés listo para escribir consultas más avanzadas, consulta Los JOINs de SQL Explicados y Domina las Subconsultas en SQL.

Paso 6: Administra Usuarios y Permisos

No conectes tus aplicaciones con la cuenta de administrador. Crea un usuario limitado (PostgreSQL lo llama rol) que solo pueda hacer lo que la aplicación necesita:

CREATE ROLE app_user WITH LOGIN PASSWORD 'change-me';

GRANT CONNECT ON DATABASE bookstore TO app_user;
GRANT USAGE ON SCHEMA public TO app_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app_user;

Ejecuta esto mientras estás conectado a la base de datos bookstore. La última línea solo cubre las tablas que existen en este momento, así que repítela después de agregar tablas nuevas. Usa una contraseña fuerte y guárdala en un archivo .env en lugar de tu código.

Lista todos los usuarios con \du. Para comprobar que el nuevo funciona, conéctate como ese usuario. Esto requiere la herramienta psql en tu propia computadora, así que quienes usan Docker deben instalar el cliente o ejecutar el comando desde el contenedor:

psql -U app_user -h localhost -d bookstore

Ingresa la contraseña cuando se te pida. Luego prueba algo que el usuario no tiene permitido hacer:

SELECT count(*) FROM books;
DROP TABLE books;

El primer comando funciona y el segundo falla con un error como must be owner of table books. Ese error es la cuenta limitada haciendo su trabajo. Puede leer y escribir datos, pero no puede destruir la tabla ni crear otros usuarios.

Tu Cadena de Conexión

Las aplicaciones y herramientas suelen pedir una sola cadena de conexión en lugar de ajustes separados. Tiene esta forma:

postgresql://app_user:tu-contraseña@localhost:5432/bookstore

Es decir, usuario:contraseña@host:puerto/base_de_datos. Guárdala en tu archivo .env o en los secretos de tu proveedor de hosting, nunca en el propio código. Si tu contraseña contiene caracteres especiales como @ o /, deben codificarse como URL.

¿Quién Puede Conectarse y Desde Dónde?

De forma predeterminada, PostgreSQL solo acepta conexiones desde la misma computadora. Dos ajustes controlan esto: listen_addresses en postgresql.conf y las reglas de pg_hba.conf. No los cambies solo para que algo funcione. Si alguna vez necesitas acceso remoto, usa un firewall, exige conexiones cifradas y permite solo las direcciones en las que confíes.

Una Nota sobre el Esquema Public

En PostgreSQL 15 y posteriores, los usuarios comunes ya no pueden crear objetos en el esquema public. Por eso importa la línea GRANT USAGE ON SCHEMA public, y por eso app_user puede leer las tablas pero no crear nuevas.

Las cuentas limitadas también reducen el daño de ataques como la inyección SQL. Para saber cómo funciona ese ataque y cómo prevenirlo, lee Inyección SQL: Cómo Funciona y Cómo Prevenirla.

Paso 7: Respalda y Restaura Tu Base de Datos

Los respaldos son el hábito más importante de la administración de bases de datos. PostgreSQL incluye pg_dump para esto. Ejecuta estos comandos desde tu terminal normal, no dentro de psql. Usa el grupo que corresponda a tu configuración.

Windows y macOS

En Windows, agrega -U postgres -h localhost a cada comando. En macOS, omítelos.

# Crea un respaldo en un formato compacto
pg_dump -U postgres -h localhost -d bookstore -F c -f bookstore.dump

# Restáuralo en una base de datos nueva y vacía
createdb -U postgres -h localhost bookstore_copy
pg_restore -U postgres -h localhost -d bookstore_copy bookstore.dump

Ubuntu o Debian

La cuenta postgres no puede escribir en tu carpeta personal, así que envía la salida a tu propio archivo con > y léela de vuelta con <:

sudo -u postgres pg_dump -F c bookstore > bookstore.dump

sudo -u postgres createdb bookstore_copy
sudo -u postgres pg_restore -d bookstore_copy < bookstore.dump

Docker

El respaldo se crea dentro del contenedor, así que cópialo hacia afuera con docker cp:

docker exec my-postgres pg_dump -U postgres -F c -f /tmp/bookstore.dump bookstore
docker cp my-postgres:/tmp/bookstore.dump ./bookstore.dump

docker cp ./bookstore.dump my-postgres:/tmp/bookstore.dump
docker exec my-postgres createdb -U postgres bookstore_copy
docker exec my-postgres pg_restore -U postgres -d bookstore_copy /tmp/bookstore.dump

Si omites -F c, obtienes un archivo de texto SQL simple, que puedes abrir en cualquier editor y restaurar con psql -f. El formato compacto -F c es más pequeño y te da más opciones al restaurar.

Comprueba la Restauración

Después de restaurar, comprueba que la copia tenga tus datos. Conéctate a ella con el mismo comando que usaste en el Paso 2, agregando el nombre de la base de datos:

Tu configuraciónConéctate a la copia
Windowspsql -U postgres -h localhost -d bookstore_copy
macOS (Homebrew)psql bookstore_copy
Ubuntu o Debiansudo -u postgres psql -d bookstore_copy
Dockerdocker exec -it my-postgres psql -U postgres -d bookstore_copy
\dt
SELECT count(*) FROM books;

Deberías ver las tablas authors y books, y un conteo de 4. Cuando termines de probar, puedes eliminar la copia con DROP DATABASE bookstore_copy;. Ejecútalo desde otra base de datos, como postgres, porque no puedes eliminar la base de datos a la que estás conectado.

Qué Incluye y Qué No Incluye un Respaldo

  • pg_dump respalda una sola base de datos, con sus tablas, datos y los permisos sobre esas tablas. No incluye los usuarios (roles), que pertenecen a todo el servidor. Para guardarlos también, ejecuta pg_dumpall --globals-only.
  • El archivo se guarda en la carpeta desde la que ejecutaste el comando. No se queda dentro de la base de datos, así que cópialo a otra unidad o a almacenamiento en la nube.
  • Restaura con la misma versión de PostgreSQL, o una más nueva, que la que creó el respaldo. Restaurar un respaldo más nuevo en un servidor más antiguo suele fallar.

Deja de Escribir la Contraseña Cada Vez

En Windows, pg_dump te pide la contraseña de postgres cada vez. Puedes establecerla para la sesión actual de la terminal:

# macOS, Linux o Git Bash
export PGPASSWORD='tu-contraseña'

# Windows PowerShell
$env:PGPASSWORD = 'tu-contraseña'

Para algo permanente y más seguro, usa un archivo de contraseñas. En Linux y macOS es ~/.pgpass (ejecuta chmod 600 ~/.pgpass) y en Windows es %APPDATA%\postgresql\pgpass.conf. Cada línea tiene este formato:

localhost:5432:bookstore:postgres:tu-contraseña

Nunca pongas contraseñas reales en un script que compartas o subas a un repositorio.

Automatiza Tus Respaldos

Un respaldo que tienes que acordarte de ejecutar es un respaldo que olvidarás. Este es un respaldo nocturno a las 2 a. m. en Linux o macOS. Abre el calendario con crontab -e y agrega:

0 2 * * * pg_dump -F c -f /home/you/backups/bookstore-$(date +\%F).dump bookstore

En Ubuntu, agrégalo mejor al calendario de la cuenta postgres (sudo crontab -u postgres -e) y escribe en una carpeta que esa cuenta pueda usar. En Windows, crea una tarea básica en el Programador de tareas que ejecute tu comando pg_dump cada noche. Conserva algunas copias recientes y guarda una en otra computadora o en almacenamiento en la nube.

Un respaldo que nunca has restaurado es solo una suposición. Prueba una restauración al menos una vez, para saber que el proceso funciona antes de necesitarlo.

Solución de Problemas Comunes

ProblemaQué significa y cómo corregirlo
psql no se reconoce (Windows)La carpeta bin de PostgreSQL no está en tu PATH. Usa SQL Shell (psql) del menú Inicio, o agrega C:\Program Files\PostgreSQL\<versión>\bin a tu PATH y abre una terminal nueva.
role "postgres" does not existEstás en una Mac con Homebrew. El administrador es tu nombre de usuario de Mac. Usa psql postgres y omite -U postgres.
password authentication failedLa contraseña es incorrecta o usas el usuario equivocado. En Ubuntu la cuenta postgres no tiene contraseña: usa sudo -u postgres psql.
connection refusedEl servidor no está en ejecución o usaste el puerto equivocado. Inicia el servicio (brew services start ..., sudo systemctl start postgresql o inicia el contenedor de Docker) y revisa el puerto 5432.
database "bookstore" does not existEstás conectado a otra base de datos o el nombre tiene un error. Ejecuta \l para listarlas.
permission denied for table ...Al usuario no se le ha dado acceso. Ejecuta las instrucciones GRANT del Paso 6 mientras estás conectado a esa base de datos.
El prompt muestra bookstore-#Olvidaste un punto y coma y psql espera más. Escribe ; y presiona Enter.
El puerto 5432 ya está en usoHay otro PostgreSQL en ejecución. Deténlo o instala el segundo en otro puerto.

Referencia Rápida

Quiero…Comando
Abrir psql como administradorConsulta la tabla del Paso 2
Listar las bases de datos\l
Cambiar de base de datos\c dbname
Listar las tablas\dt
Describir una tabla\d tablename
Listar los usuarios\du
Crear una base de datosCREATE DATABASE name;
Crear un usuarioCREATE ROLE name WITH LOGIN PASSWORD '...';
Dar acceso a las tablasGRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO name;
Respaldar una base de datospg_dump -F c -f file.dump dbname
Restaurar un respaldopg_restore -d newdb file.dump
Respaldar usuarios y rolespg_dumpall --globals-only -f roles.sql
Salir de psql\q

Mejores Prácticas para Principiantes

  • Nombra las cosas con claridad. Usa nombres en minúsculas con guiones bajos, como published_year. Los nombres con mayúsculas y minúsculas mezcladas necesitan comillas dobles en todas partes, lo cual resulta molesto.
  • Dale una clave primaria a cada tabla.
  • Usa los tipos de datos correctos. NUMERIC para dinero, TIMESTAMPTZ para fechas con hora y BOOLEAN para sí o no.
  • Agrega restricciones. NOT NULL, CHECK y las claves foráneas impiden que entren datos incorrectos.
  • Usa un usuario limitado para las aplicaciones, nunca la cuenta de administrador.
  • Haz un respaldo antes de cambios riesgosos, automatiza los respaldos periódicos y prueba tus restauraciones.
  • Mantén PostgreSQL actualizado, ya que las versiones menores nuevas incluyen correcciones de seguridad y de errores.

Errores Comunes que Debes Evitar

  • Nunca probar una restauración. Un respaldo que no se puede restaurar no sirve de nada.
  • Olvidar el punto y coma. Si psql muestra bookstore-# en lugar de bookstore=#, está esperando que termines la instrucción.
  • Usar FLOAT para dinero. Los errores de redondeo se acumulan.
  • Subir contraseñas a Git. Una contraseña en un script o en un archivo de configuración la puede leer cualquiera con acceso al repositorio, así que mantenla fuera del control de versiones.
  • Abrir la base de datos a todo internet. De forma predeterminada, PostgreSQL solo escucha en la máquina local. Déjalo así a menos que tengas un firewall y una razón específica.
  • Guardar el único respaldo en la misma computadora. Si el disco falla, pierdes tanto la base de datos como el respaldo.

Ejercicios de Práctica

Prueba esto por tu cuenta. Solo usan lo que aprendiste arriba:

  1. Agrega un cuarto autor y uno de sus libros. Revisa el resultado con SELECT * FROM books;.
  2. Crea un usuario de solo lectura llamado reader_user que únicamente pueda hacer SELECT. Conéctate como ese usuario y comprueba que un INSERT falla.
  3. Haz el simulacro completo de desastre: respalda bookstore, elimina la base de datos (desde la base de datos postgres), restáurala y confirma que el conteo de libros sigue siendo correcto.
  4. Escribe tu propia cadena de conexión para app_user y guárdala en un archivo .env.

A Dónde Ir Después

Cuando te sientas cómodo con lo básico, buenos siguientes pasos incluyen:

  • Aprender a consultar tus datos con los JOINs de SQL y las subconsultas
  • Acelerar las consultas lentas con índices (consulta por qué tu consulta SQL es lenta)
  • Usar transacciones (BEGIN, COMMIT, ROLLBACK) para que un grupo de cambios se complete o falle junto
  • Conectar PostgreSQL a una aplicación de Python con psycopg o SQLAlchemy
  • Probar una herramienta gráfica como pgAdmin o DBeaver

Conclusión

PostgreSQL te da una base de datos confiable, gratuita y basada en estándares para aprender. En esta guía la instalaste, te conectaste con psql, creaste una base de datos y tablas relacionadas, agregaste datos, creaste un usuario limitado e hiciste un respaldo que restauraste y verificaste.

La mejor manera de que estas habilidades se te queden es construir algo. Toma una idea pequeña que te importe, como una lista de libros, un control de presupuesto o los contactos de un proyecto de un cliente, diseña dos o tres tablas para ella y adminístrala de la misma forma: créala, cárgala, respáldala y restáurala. Cada vez que lo hagas, los comandos se sentirán más naturales y tendrás una base real para el análisis de datos, el desarrollo web o la administración de bases de datos.