---
# System prepended metadata

title: Ús d'un contenidor amb postgreSQL
tags: [UF2 Persistència en BDR-BDOR]

---

# 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):

![imatge](https://hackmd.io/_uploads/HJle18icJg.png)

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

![imatge](https://hackmd.io/_uploads/H1GjJLocyg.png)

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.).






