Passo 7: Impostare il database

5.0 version
Maintained

Impostare il database

Il sito web del guestbook della conferenza è dedicato alla raccolta di feedback durante le conferenze. Abbiamo bisogno di memorizzare in modo permanente i commenti dei partecipanti.

Un commento può essere descritto da una struttura dati fissa: un autore, la sua email, il testo del feedback e una foto opzionale. Questo tipo di dati si presta a essere memorizzato in un classico database relazionale.

PostgreSQL è il motore di database che useremo.

Aggiunta di PostgreSQL a Docker Compose

Sulla nostra macchina locale, abbiamo deciso di utilizzare Docker per gestire i servizi. Creare un file docker-compose.yaml e aggiungere PostgreSQL come servizio:

docker-compose.yaml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
version: '3'

services:
    database:
        image: postgres:11-alpine
        environment:
            POSTGRES_USER: main
            POSTGRES_PASSWORD: main
            POSTGRES_DB: main
        ports: [5432]

Questo installerà un server PostgreSQL versione 11 e configurerà alcune variabili d’ambiente, che controllano nome e credenziali del database. I valori non hanno molta importanza.

Esponiamo anche la porta PostgreSQL (5432) del container all’host locale. Questo ci aiuterà ad accedere al database dalla nostra macchina.

Nota

L’estensione pdo_pgsql dovrebbe essere stata installata quando PHP è stato impostato, in uno dei passi precedenti.

Avvio di Docker Compose

Avviare Docker Compose in background (-d):

1
$ docker-compose up -d

Attendere un po' per far partire il database e verificare che tutto funzioni correttamente:

1
2
3
4
5
$ docker-compose ps

        Name                      Command              State            Ports
---------------------------------------------------------------------------------------
guestbook_database_1   docker-entrypoint.sh postgres   Up      0.0.0.0:32780->5432/tcp

Se non ci sono container in esecuzione o se la colonna State non mostra la scritta Up, controllare i log di Docker Compose:

1
$ docker-compose logs

Accesso al database locale

L’utilizzo del programma a riga di comando psql potrebbe rivelarsi utile di tanto in tanto. Occorre però ricordare le credenziali e il nome del database. Meno ovvio, occorre anche conoscere la porta locale con cui il database gira sull’host. Docker sceglie una porta casuale in modo da poter lavorare su più di un progetto contemporaneamente utilizzando PostgreSQL (la porta locale è parte dell’output di docker-compose ps).

Se si esegue psql tramite la CLI di Symfony, non è necessario ricordare nulla.

La CLI di Symfony rileva automaticamente i servizi Docker in esecuzione per il progetto ed espone le variabili d’ambiente di cui psql ha bisogno per connettersi al database.

Grazie a queste convenzioni, l’accesso al database tramite symfony run è molto più semplice:

1
$ symfony run psql

Nota

Se non si dispone del binario psql sull’host locale, è possibile eseguirlo anche tramite docker:

1
$ docker exec -it guestbook_database_1 psql -U main -W main

Aggiungere PostgreSQL a SymfonyCloud

Per l’infrastruttura di produzione su SymfonyCloud, l’aggiunta di un servizio come PostgreSQL dovrebbe essere fatta nel file, attualmente vuoto, .symfony/services.yaml:

.symfony/services.yaml
1
2
3
4
db:
    type: postgresql:11
    disk: 1024
    size: S

Il servizio db è un database PostgreSQL versione 11 (come per Docker), che vogliamo mettere a disposizione su un piccolo container con 1GB di disco.

Abbiamo anche bisogno di «collegare» il DB al container dell’applicazione, che è descritto in .symfony.cloud.yaml:

.symfony.cloud.yaml
1
2
relationships:
    database: "db:postgresql"

Il servizio db di tipo postgresql si riferisce al container database dell’applicazione.

L’ultimo passo è quello di aggiungere l’estensione pdo_pgsql a PHP:

.symfony.cloud.yaml
1
2
3
4
runtime:
    extensions:
        - pdo_pgsql
        # other extensions here

Ecco tutte le modifiche di .symfony.cloud.yaml:

patch_file
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
--- a/.symfony.cloud.yaml
+++ b/.symfony.cloud.yaml
@@ -4,6 +4,7 @@ type: php:7.3

 runtime:
     extensions:
+        - pdo_pgsql
         - apcu
         - mbstring
         - sodium
@@ -12,6 +13,9 @@ runtime:
 build:
     flavor: none

+relationships:
+    database: "db:postgresql"
+
 web:
     locations:
         "/":

Fare commit di queste modifiche e poi rifare il deploy su SymfonyCloud:

1
2
3
$ git add .
$ git commit -m'Configuring the database'
$ symfony deploy

Accesso al database di SymfonyCloud

PostgreSQL è ora in esecuzione sia localmente tramite Docker sia in produzione su SymfonyCloud.

Come abbiamo appena visto, eseguendo symfony run psql si connette automaticamente al database ospitato da Docker, grazie alle variabili d’ambiente esposte da symfony run.

Se ci si vuole connettere a PostgreSQL ospitato sui container di produzione, si può aprire un tunnel SSH tra la macchina locale e l’infrastruttura SymfonyCloud:

1
$ symfony tunnel:open --expose-env-vars

Per impostazione predefinita, i servizi di SymfonyCloud non sono esposti come variabili d’ambiente sulla macchina locale. È necessario farlo esplicitamente utilizzando il parametro --expose-env-vars. Perché? Il collegamento al database di produzione è un’operazione pericolosa. Si possono mettere a repentaglio i dati reali. Richiedere questa opzione è come confermare che effettivamente l’azione è quella desiderata.

Ora, connettersi al database PostgreSQL remoto tramite symfony run psql, come in precedenza:

1
$ symfony run psql

Al termine, non dimenticare di chiudere il tunnel:

1
$ symfony tunnel:close

Suggerimento

Per eseguire query SQL sul database di produzione invece di usare una shell, si può anche usare il comando symfony sql.

Esporre le variabili d’ambiente

Docker Compose e SymfonyCloud funzionano perfettamente con Symfony, grazie alle variabili d’ambiente.

Controllare tutte le variabili d’ambiente symfony esposte, eseguendo symfony var:export:

1
2
3
4
5
6
7
8
$ symfony var:export

PGHOST=127.0.0.1
PGPORT=32781
PGDATABASE=main
PGUSER=main
PGPASSWORD=main
# ...

Le variabili d” ambiente PG* vengono lette dal comando psql. E le altre?

Quando si apre un tunnel verso SymfonyCloud usando il parametro --expose-env-vars, il comando var:export restituisce le variabili d’ambiente remote:

1
2
3
$ symfony tunnel:open --expose-env-vars
$ symfony var:export
$ symfony tunnel:close

  • « Previous Passo 6: La creazione di un controller
  • Next » Passo 8: Descrivere la struttura dati

This work, including the code samples, is licensed under a Creative Commons BY-NC-SA 4.0 license.