# Breu guia d'ús de postgreSQL. Contenidor docker amb postgreSQL.
## Requisits
Disposar del Docker Desktop prèviament instal·lat
## Passos per obtenir la imatge de postgres, configuracions i execució
### Fer el pull de la imatge de Postgres:
Obriu una terminal (cmd o powershell si feu servir windows) i escriviu la següent ordre per descarregar la imatge oficial de Postgres:
`docker pull postgres`
### Execució del contenidor de Postgres:
Després de fer el pull, podeu executar el contenidor amb la següent ordre:
`docker run -d --name postgres-container -e POSTGRES_PASSWORD=contrasenya -p 5432:5432 postgres`
Aquesta comanda fa el següent:
* *--name postgres-container* : assigna un nom al contenidor, en aquest cas li estem dient que el nom que tindrà és **postgres-container**. Podeu substituir-lo pel nom que volgueu.
* *-e POSTGRES_PASSWORD=contrasenya* : estableix la contrasenya per l'usuari postgres. Substituiu **contrasenya** per la contrasenya que desitgeu.
* *-p 5432:5432* : mapeja el port 5432 del contenidor al port 5432 de la vostra màquina. El primer 5432 correspon al port de la màquina (es pot canviar per un altre i fer que es mapegi a un altre), mentres que el segon 5432 és el port propi del postgres.
* *postgres* : serveix per indicar que es vol utilitzar la imatge oficial de Postgres.
La comanda anterior no especifica l'usuari, si es volgués fer hauríem d'escriure:
```
docker run -d --name postgres-container -e POSTGRES_USER=usuari -e POSTGRES_PASSWORD=contrasenya -p 5432:5432 postgres
```
On -e POSTGRES_USER=usuari serveix concretament per dir l'usuari amb el qual volem accedir amb plens permisos.
### Verificar que el contenidor està en funcionament:
Podeu comprovar que el contenidor està corrent amb aquesta comanda:
`docker ps`
Al Docker Desktop podeu també identificar-ho així (mireu el pilot verd de l'esquerra al nom del contenidor):

### Accedir a la base de dades de Postgres:
Per connectar-vos a la base de dades des de dins del contenidor (via la seva consola), utilitzeu aquesta comanda:
`docker exec -it postgres-container psql -U postgres`
Des del HeidiSQL podeu crear una connexió específica, especificant la ip (en aquest cas la ip és la corresponent al localhost, doncs el nostre contenidor hi és al localhost) i la contrasenya:

Si a l'hora de fer el docker run hi haguèssiu ficat un usuari cal canviar l'usuari postgres que apareix per defecte per l'usuari especificat.
### Aturar i rearrencar
Un cop deixeu de treballar amb el contenidor el podeu aturar fent:
```
docker stop postgres-container
```
I per tornar-lo a arrencar fer:
```
docker start postgres-container
```
Substituiu **postgres-container** pel nom que tingui el vostre contenidor.
## Primers passos d'ús del postgres
Ja connectats el que es veurà és el següent prompt indicant que s'ha accedit a postgres:
```
postgres=#
```
* El prompt # significa que el sistema està llest, esperant instruccions
* En cas que no finalitzeu una instrucció, com per exemple us falti el ';', veureu que el prompt serà `postgres-#`. Fins que no el fiqueu no executarà la instrucció i canviarà el prompt.
* Si el que us falta és un parèntesi, veureu que el prompt serà `prova(#` i si el que us falten són cometes veureu `prova"#`
* En cas de voler sortir d'aquest mode escriviu `\q` (és a dir, quit).
* Crear una base de dades nova es fa igual que altres SGDB sql, és a dir:
```
postgres=# CREATE DATABASE prova;
CREATE DATABASE
```
Un cop fet veureu que apareix el missatge CREATE DATABASE.
* Per connectar-nos a una base de dades fem (similar al USE de mariadb/mysql):
```
\c prova
```
Veureu que el prompt canvia i ficarà el nom de la base de dades a la qual us heu connectat: `prova=#`
* Per llistar les bases de dades existents fem **\l**:
```
List of databases
Name | Owner | Encoding | Locale Provider | Collate | Ctype | Locale | ICU Rules | Access privileges
-----------+----------+----------+-----------------+------------+------------+--------+-----------+-----------------------
DAM | postgres | UTF8 | libc | en_US.utf8 | en_US.utf8 | | |
postgres | postgres | UTF8 | libc | en_US.utf8 | en_US.utf8 | | |
prova | postgres | UTF8 | libc | en_US.utf8 | en_US.utf8 | | |
prova2 | postgres | UTF8 | libc | en_US.utf8 | en_US.utf8 | | |
```
Per sortir de la llista escrivim el caràcter **q**.
* Per llistar les taules contingudes a la base de dades que estem connectats fem **\dt**:
```
List of relations
Schema | Name | Type | Owner
--------+-------+-------+----------
public | trens | table | postgres
(1 row)
```
* Per llistar els indexos definits (mostra tots de totes les taules de la BD) fem un **\di**:
```
List of relations
Schema | Name | Type | Owner | Table
--------+---------------------+-------+----------+-------
public | trens_desc_tren_key | index | postgres | trens
public | trens_pkey | index | postgres | trens
```
* Altres comandes interessants:
* `\h` ens mostra l'ajuda disponible en termes de comandes/instruccions (DML/DDL SQL) que es poden fer.
* `\?` ens mostra l'ajuda a nivell de comandes meta del psql com les que acabem de veure adalt (\dt, \l, etc.).