Stap 7: Een database opzetten

5.0 version
Maintained

Een database opzetten

De website van het conferentiegastenboek verzamelt feedback tijdens conferenties. We moeten de reacties van deelnemers aan de conferentie ergens permanent opslaan.

Een reactie kunnen we beschrijven met een vaste datastructuur: een auteur, zijn e-mail, de tekst van de feedback en een optionele foto. Dit soort gegevens kunnen het beste opgeslagen worden in een traditioneel relationeel databasesysteem.

PostgreSQL is het database systeem dat we zullen gebruiken.

PostgreSQL aan Docker Compose toevoegen

Op onze lokale machine gebruiken we Docker om onze services te beheren. Maak een docker-compose.yaml bestand aan en voeg PostgreSQL toe als een service:

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]

Dit zal een PostgreSQL server versie 11 installeren en een aantal omgevingsvariabelen configureren om de databasenaam en inloggegevens in te stellen. De waarden hiervan doen er niet direct toe.

We zetten ook de PostgreSQL-poort ( 5432 ) van de container open voor de lokale host. Dat zal ons toegang geven tot de database vanaf onze machine.

Notitie

De pdo_pgsql extensie zou moeten zijn geïnstalleerd toen PHP opgezet werd in een vorige stap.

Docker Compose starten

Start Docker Compose in de achtergrond ( -d ):

1
$ docker-compose up -d

Wacht even tot de database volledig opgestart is en controleer dan of alles goed draait:

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

Als er geen containers draaien of als de State kolom niet Up bevat, bekijk dan de Docker Compose logs:

1
$ docker-compose logs

De lokale database benaderen

Het psql command-line hulpprogramma kan soms van pas komen. Je moet dan wel de inloggegevens en de naam van de database onthouden. Maar iets minder handig is dat je ook moet weten op welke lokale poort de database op de host draait. Docker kiest hiervoor namelijk een willekeurige poort, zodat je aan meer dan één project tegelijk met PostgreSQL kunt werken (de lokale poort kan je vinden via het docker-compose ps commando).

Als je psql via de Symfony CLI draait, hoef je niets te onthouden.

De Symfony CLI detecteert automatisch de Docker-services die voor het project draaien en stelt de omgevingsvariabelen in die psql nodig heeft om een verbinding te maken met de database.

Dankzij deze conventies is het benaderen van de database via symfony run veel eenvoudiger:

1
$ symfony run psql

Notitie

Als de psql binary niet aanwezig is op jouw lokale host kun je deze ook uitvoeren via docker :

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

PostgreSQL toevoegen aan SymfonyCloud

Een service zoals PostgreSQL toevoegen aan de productie-infrastructuur op SymfonyCloud doe je door deze toe te voegen in het .symfony/services.yaml bestand. Dit bestand is momenteel nog leeg:

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

De db service is een PostgreSQL versie 11 database (zoals we in Docker gebruiken) die we willen draaien in een kleine container met 1GB schijfruimte.

We moeten de DB ook “koppelen” aan de applicatie-container die beschreven staat in .symfony.cloud.yaml:

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

In de applicatie-container wordt er aan de db service van het type postgresql gerefereerd met de naam database.

Als laatste stap voegen we de pdo_pgsql extensie nog toe aan de PHP-runtime:

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

Hier is de volledige diff van de wijzigingen aan .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:
         "/":

Commit deze wijzigingen en deploy ze opnieuw naar SymfonyCloud:

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

Toegang tot de SymfonyCloud database

PostgreSQL draait nu zowel lokaal via Docker als in productie op SymfonyCloud.

Zoals we zojuist hebben gezien kun je met het symfony run psql commando, automatisch een verbinding maken naar de database die door Docker wordt gehost, dit alles dankzij de omgevingsvariabelen die door symfony run werden ingesteld.

Als je verbinding wil maken met PostgreSQL in de containers van de productieomgeving, kun je een SSH tunnel leggen tussen de lokale machine en de SymfonyCloud infrastructuur:

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

SymfonyCloud services worden standaard niet via omgevingsvariabelen op de lokale machine ingesteld. Je moet dit expliciet doen door de --expose-env-vars parameter te gebruiken. Waarom? Verbinding maken met een productiedatabase is gevaarlijk. Je kan echte data om zeep helpen. Door het gebruik van de parameter, geef je aan dat dit echt de bedoeling is.

Verbind nu met de externe PostgreSQL database via symfony run psql:

1
$ symfony run psql

Vergeet niet de tunnel te sluiten wanneer je klaar bent:

1
$ symfony tunnel:close

Tip

Om wat SQL queries uit te voeren op de productiedatabase, kan je ook het symfony sql commando gebruiken, in plaats van een shell te starten.

Werken met omgevingsvariabelen

Docker Compose en SymfonyCloud werken naadloos samen met Symfony dankzij het gebruik van omgevingsvariabelen.

Controleer alle omgevingsvariabelen die door symfony gebruikt worden via 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
# ...

De PG* omgevingsvariabelen worden gebruikt door het psql hulpprogramma. En de rest?

Wanneer er een tunnel ligt naar SymfonyCloud via de --expose-env-vars parameter, geeft het var:export commando de externe omgevingsvariabelen weer:

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

  • « Previous Stap 6: Een controller aanmaken
  • Next » Stap 8: Beschrijving van de gegevensstructuur

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