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
bookstorecon 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:
| Nivel | Qué es | Ejemplo |
|---|---|---|
| Servidor | El programa de PostgreSQL en ejecución. Una computadora puede ejecutar varios. | El servicio que escucha en el puerto 5432 |
| Base de datos | Una colección de datos separada dentro del servidor. | bookstore |
| Esquema | Una carpeta de tablas dentro de una base de datos. Toda base de datos empieza con uno llamado public. | public |
| Tabla | Filas 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
- Descarga el instalador de la página oficial de descargas de PostgreSQL.
- Ejecútalo y conserva los componentes predeterminados. Incluye el servidor, pgAdmin (una herramienta gráfica) y las herramientas de línea de comandos.
- Cuando se te pida, establece una contraseña para el usuario
postgres. Es la cuenta principal de administrador, así que anota la contraseña. - 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ón | Conéctate como administrador |
|---|---|
| Windows | psql -U postgres -h localhost |
| macOS (Homebrew) | psql postgres |
| Ubuntu o Debian | sudo -u postgres psql |
| Docker | docker 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:
| Comando | Qué hace |
|---|---|
\l | Lista todas las bases de datos |
\c dbname | Se conecta a una base de datos |
\dt | Lista las tablas de la base de datos actual |
\d tablename | Describe las columnas y restricciones de una tabla |
\du | Lista los usuarios (llamados roles) |
\x | Cambia a un formato vertical para resultados anchos |
\q | Sale 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 IDENTITYhace que PostgreSQL numere las filas por ti (1, 2, 3, etc.).PRIMARY KEYidentifica de forma única cada fila.NOT NULLsignifica 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.DEFAULTcompleta un valor cuando no lo proporcionas.
Tipos de Datos Comunes
| Tipo | Úsalo para |
|---|---|
INTEGER, SMALLINT, BIGINT | Números enteros |
NUMERIC(8, 2) | Decimales exactos, como dinero |
TEXT, VARCHAR(n) | Texto |
BOOLEAN | Verdadero o falso |
DATE, TIMESTAMPTZ | Fechas, 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ón | Conéctate a la copia |
|---|---|
| Windows | psql -U postgres -h localhost -d bookstore_copy |
| macOS (Homebrew) | psql bookstore_copy |
| Ubuntu o Debian | sudo -u postgres psql -d bookstore_copy |
| Docker | docker 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_dumprespalda 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, ejecutapg_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
| Problema | Qué 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 exist | Estás en una Mac con Homebrew. El administrador es tu nombre de usuario de Mac. Usa psql postgres y omite -U postgres. |
password authentication failed | La contraseña es incorrecta o usas el usuario equivocado. En Ubuntu la cuenta postgres no tiene contraseña: usa sudo -u postgres psql. |
connection refused | El 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 exist | Está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 uso | Hay otro PostgreSQL en ejecución. Deténlo o instala el segundo en otro puerto. |
Referencia Rápida
| Quiero… | Comando |
|---|---|
| Abrir psql como administrador | Consulta 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 datos | CREATE DATABASE name; |
| Crear un usuario | CREATE ROLE name WITH LOGIN PASSWORD '...'; |
| Dar acceso a las tablas | GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO name; |
| Respaldar una base de datos | pg_dump -F c -f file.dump dbname |
| Restaurar un respaldo | pg_restore -d newdb file.dump |
| Respaldar usuarios y roles | pg_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.
NUMERICpara dinero,TIMESTAMPTZpara fechas con hora yBOOLEANpara sí o no. - Agrega restricciones.
NOT NULL,CHECKy 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
psqlmuestrabookstore-#en lugar debookstore=#, está esperando que termines la instrucción. - Usar
FLOATpara 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:
- Agrega un cuarto autor y uno de sus libros. Revisa el resultado con
SELECT * FROM books;. - Crea un usuario de solo lectura llamado
reader_userque únicamente pueda hacerSELECT. Conéctate como ese usuario y comprueba que unINSERTfalla. - Haz el simulacro completo de desastre: respalda
bookstore, elimina la base de datos (desde la base de datospostgres), restáurala y confirma que el conteo de libros sigue siendo correcto. - Escribe tu propia cadena de conexión para
app_usery 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
psycopgo 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.
