| Both sides previous revisionPrevious revisionNext revision | Previous revision |
| proyecto:configurar_postgres [2019/05/27 04:24] – ahogan | proyecto:configurar_postgres [2026/09/25 18:31] (current) – Lenguaje sin género en la guía del servidor semorale |
|---|
| ====== Configurar Postgres ====== | ====== Configurar Postgres ====== |
| |
| El usuario de Postgres, por defecto, se llama ''postgres'' y nuestro usuario es ''cc3201'', así que si intentas con: | Su máquina ya tiene Postgres 17 instalado y funcionando, así que no hay que instalar nada. En esta página van a crear su usuario de Postgres, su base de datos y un esquema para las tablas del proyecto. Toma unos 10 minutos. |
| | |
| | Todos los comandos de esta página se ejecutan **dentro del servidor**, después de entrar por SSH (ver [[proyecto:acceso_al_servidor|Acceso al servidor]]). En los ejemplos usamos la máquina 40 y un esquema llamado ''peliculas''; ustedes usan su número de grupo y el nombre que quieran. |
| | |
| | ===== Qué hay dentro de Postgres ===== |
| | |
| | Antes de empezar, conviene tener claro qué es cada cosa que vamos a crear: |
| | |
| | {{proyecto:servidor_postgres_por_dentro.png?direct&900|Roles, base de datos, esquemas y tablas en Postgres}} |
| | |
| | ^ Término ^ Qué es ^ |
| | | **Postgres** (o PostgreSQL) | El sistema de bases de datos del curso. Es un programa que queda corriendo en su máquina y responde consultas SQL. | |
| | | **psql** | El cliente de Postgres para la terminal. Ahí se escribe SQL y se ven los resultados. | |
| | | **rol** | Una cuenta de Postgres. Es distinta de la cuenta de Linux, aunque aquí ambas se llamen ''cc3201''. | |
| | | **superusuario** | Un rol que puede hacer cualquier cosa en Postgres (crear bases, esquemas, otros roles). | |
| | | **base de datos** | Un contenedor de esquemas. Un mismo Postgres puede tener varias bases; ustedes van a usar una sola, ''cc3201''. | |
| | | **esquema** (//schema//) | Una carpeta de tablas dentro de una base. Sirve para agrupar las tablas del proyecto y no mezclarlas con otras. | |
| | | **search_path** | La lista de esquemas donde Postgres busca una tabla cuando no le dicen el esquema. | |
| | |
| | ===== Paso 1: el error inicial ===== |
| | |
| | Si entran a ''psql'' recién llegados, falla: |
| |
| <code> | <code> |
| </code> | </code> |
| |
| dice | {{proyecto:servidor_pg_01_psql_sin_rol.png?direct&900|psql dice que el rol cc3201 no existe}} |
| |
| <code> | Esto es esperable. ''psql'' intenta entrar a Postgres con un rol del mismo nombre que su usuario de Linux (''cc3201''), y ese rol todavía no existe. Postgres viene solo con el rol de administración, que se llama ''postgres''. (La parte del //socket// del mensaje es la vía interna por la que ''psql'' habla con Postgres dentro de la misma máquina; no hay que hacer nada con eso.) |
| psql: FATAL: role "cc3201" does not exist | |
| </code> | ===== Paso 2: crear su rol y su base de datos ===== |
| |
| Pero, dado que tenemos ''sudo'', podemos usar el siguiente comando (''su'': ''s''witch ''u''ser) para ingresar como el usuario ''postgres''. | Como tenemos ''sudo'', podemos cambiarnos al usuario ''postgres'' de Linux, que sí puede administrar Postgres (''su'': ''s''witch ''u''ser): |
| |
| <code> | <code> |
| </code> | </code> |
| |
| Entonces podemos crear un usuario para ''cc3201'' en Postgres: | ''sudo'' pide la contraseña de SSH. La línea de comandos cambia a ''postgres@cc3201-XX:/home/cc3201$'', lo que indica que la sesión ahora es del usuario ''postgres'' de Linux. Entonces creamos el rol ''cc3201'' en Postgres: |
| |
| <code> | <code> |
| </code> | </code> |
| |
| La opción ''-s'' significa que ''cc3201'' será un //superuser// (como ''postgres'') que tiene poder administrativo. Ahora tenemos que crear una base de datos para el usuario: | La opción ''-s'' significa que ''cc3201'' será un //superuser// (como ''postgres''), así no van a tener problemas de permisos durante el proyecto. Ahora creamos una base de datos que se llame igual que el rol, con ''cc3201'' como dueño (''-O'' es //owner//): |
| |
| <code> | <code> |
| </code> | </code> |
| |
| Después, podemos salir de la cuenta de ''postgres'' y regresar al usuario ''cc3201'': | La base se llama igual que el rol porque ''psql'', si no le dicen otra cosa, entra a la base con el nombre del rol. Así basta con escribir ''psql'', sin opciones. |
| | |
| | Si ninguno de los dos comandos imprime nada, funcionaron. Después, salimos de la cuenta de ''postgres'' y volvemos al usuario ''cc3201'': |
| |
| <code> | <code> |
| </code> | </code> |
| |
| Ahora, podemos probar Postgres: | Así se ve el paso completo: |
| | |
| | {{proyecto:servidor_pg_02_crear_usuario.png?direct&830|Crear el rol y la base como usuario postgres}} |
| | |
| | ===== Paso 3: probar Postgres y crear su esquema ===== |
| | |
| | Ahora ''psql'' debería funcionar: |
| |
| <code> | <code> |
| psql | psql |
| </code> | </code> |
| | |
| | La línea de comandos cambia a ''cc3201=#''. El ''cc3201'' es la base en la que están y el ''#'' indica que son superusuario. Dentro de ''psql'', cada instrucción SQL termina en '';'' (si se les olvida, ''psql'' espera más texto y la línea cambia a ''cc3201-#''; escriban '';'' y Enter). Para salir de ''psql'', ''\q''. |
| | |
| | Para ver la versión: |
| |
| <code> | <code> |
| </code> | </code> |
| |
| Finalmente, podemos crear un esquema (//schema//), que es como un grupo de tablas (aquí hay que reemplazar ''<nombre>'' con el nombre del esquema que quieren tener): | Debería responder con una línea que empieza con ''PostgreSQL 17''. |
| | |
| | Luego creamos un esquema para las tablas del proyecto. Hay que reemplazar ''<nombre>'' con el nombre que quieran, en minúsculas y sin espacios ni tildes (por ejemplo ''peliculas''): |
| |
| <code> | <code> |
| </code> | </code> |
| |
| Para evitar tener que poner el esquema cada vez, se puede agregarlo al //search_path// del usuario: | Sin más, para usar una tabla del esquema habría que escribir siempre ''<nombre>.tabla''. Para no tener que hacerlo, agregamos el esquema al //search_path// del usuario: |
| |
| <code> | <code> |
| </code> | </code> |
| |
| Ahora, se puede usar el nombre de una tabla sin el esquema (p.ej., se puede usar ''SELECT * FROM tabla'' en vez de ''SELECT * FROM <nombre>.tabla''). | Esto le dice a Postgres: "cuando pida una tabla sin esquema, búscala primero en ''<nombre>'' y después en ''public''". También define dónde quedan las tablas nuevas, porque ''CREATE TABLE'' sin esquema crea la tabla en el primero de la lista. ''public'' es un esquema que viene creado en toda base de datos. |
| | |
| | {{proyecto:servidor_pg_03_version_esquema.png?direct&900|Versión de Postgres, creación del esquema y search_path}} |
| | |
| | ===== Paso 4: comprobar el search_path ===== |
| | |
| | El cambio de ''search_path'' corre desde la próxima vez que entren a ''psql''. Hay que salir con ''\q'' y volver a entrar; si no, las tablas que creen en esa misma sesión quedan en el esquema ''public''. En la sesión nueva: |
| | |
| | <code> |
| | cc3201=# SHOW search_path; |
| | </code> |
| | |
| | {{proyecto:servidor_pg_04_search_path.png?direct&500|SHOW search_path en una sesión nueva}} |
| | |
| | Debería responder ''<nombre>, public''. Si responde ''"$user", public'', todavía están en la sesión antigua. |
| | |
| | Ahora se puede usar el nombre de una tabla sin el esquema (p.ej., ''SELECT * FROM tabla'' en vez de ''SELECT * FROM <nombre>.tabla''). |
| | |
| | Con esto ya se pueden crear tablas, cargar datos, armar índices y hacer consultas. Cuando haga falta conectarse desde su notebook o desde la aplicación, sigan con [[proyecto:conexion_externa|Conexión externa]]. |
| |
| Estamos listos para crear tablas, cargar datos, armar índices, hacer consultas ... | |