Skip to content

Verbinden met de database

Als je met een database wilt werken zijn er drie opties.

Database van HBO-ICT

Op de HBO-ICT cloud staan je credentials om verbinding te maken met de HBO-ICT api.

api1

Via MySQL Openen in de browser kan je phpMyAdmin bereiken. Daar zie je ook de naam van je database. Dit is prefix + dev of live.

api2

Flask gaat deze credentials uit een enviroment bestand (.env) lezen. Dit bestand staat niet op gitlab, dat is niet veilig.

Creeer dus een .env bestand. Soms staat dit al in het startproject als .env.example. Pas dan de naam aan.

# Hier moet je eigen juiste credentials invullen
API_URL="https://api.hboooooooo-iiiiiiiiiiict.cloud"
API_KEY="ditkloptniet" 
DATABASE="ditmoetjeveranderen"

Danger

Track bestanden zoals .env nooit met Git. Zodra het op Gitlab of Github staat is het heel lastig dit helemaal te verwijderen. Er wordt op Gitlab en Github actief gezocht door hackers naar dit soort informatie. Gebruikt een .gitignore bestand!

Controleer of je een bestand hebt app/settings.py.

# app/settings.py
from os import environ

API_KEY = environ.get("API_KEY")
API_URL = environ.get("API_URL")
DATABASE = environ.get("DATABASE")

Controleer of onderstaande in de Flask app configuratie staat.

# app/__init__.py
app.config.from_pyfile("settings.py")

In app/db.py kan je zien hoe de credentials worden gebruikt om een HTTP request te sturen naar de HBO-ICT API

Lokaal een database gebruiken

Zoek op internet hoe je dit doet.

Database met Docker

Warning

Deze methode is moeilijker dan werken met HBO-ICT.cloud

Installeer Docker en test of dit goed werkt.

Maak naast app een directory instance en db aan.

Maak een file db/docker-compose.yml aan

volumes:
  data:
services:
  db:
    image: mariadb:latest
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: Who_Pays_What
      MYSQL_USER: WhoPaysWhatUser
      MYSQL_PASSWORD: Whopayswhat1
    volumes:
      - data:/var/lib/mysql
      - .:/docker-entrypoint-initdb.d
    ports:
      - "3306:3306"

en ook een bestand db/schema.sql. Deze wordt automatisch gerunned bij het starten van de container. Met bijvoorbeeld

DROP SCHEMA IF EXISTS `Who_Pays_What`;    
CREATE SCHEMA `Who_Pays_What`;
USE `Who_Pays_What`;

CREATE TABLE `Participant`(
    `participantId` INT NOT NULL AUTO_INCREMENT,    
    `firstname` VARCHAR(50),
    `lastname` VARCHAR(100),
    `emailaddress` VARCHAR(250),
    `isOrganizer` BIT,
    `telephonenumber` VARCHAR(15),
    PRIMARY KEY(`participantId`)
);


INSERT INTO `Participant`(`firstname`, `lastname`, `telephonenumber`) VALUES('Elisa', 'Jansen', '020999666420');
INSERT INTO `Participant`(`firstname`, `lastname`, `emailaddress`) VALUES('Suhayb', 'El Gouch','s.el.gouch@hva.nl');

Maak een bestand instance/db.config

[mysql]
host = localhost
user = WhoPaysWhatUser
password = Whopayswhat1
database = Who_Pays_What

Question

Zie je dat de database gegevens steeds terugkomen?

Zorg dat Flask ook een connectie kan maken met deze database. In __init__.py

from configparser import ConfigParser
parser = ConfigParser()
parser.read("instance/db.config")
app.config["MYSQL_CONFIG"] = dict(parser.items("mysql"))

Nu kan je binnen Flask een query sturen. Bijvoorbeeld

from flask import current_app
import mysql.connector

# Establish database connection
config = current_app.config["MYSQL_CONFIG"]
db = mysql.connector.connect(**config)
cursor = connection.cursor(dictionary=True, buffered=True)

# build and execute query
query = "SELECT firstname FROM Participant WHERE lastname=? and telephonenumber=?"
values = ("Jansen", "020999666420")
cursor.execute(query, values)
result = cursor.fetchone() # "Elisa"
cursor.close()

Danger

Gebruik de methode met de vraagtekens om je query te maken. Gebruik geen string-formatting, dit is een beveilingsrisico!

Start nu de database. Dit doen we met behulp van een zogenaamde container techniek: Docker. Ga in de terminal met het commando $ cd db naar de db directory. Geef daar het commando $ docker compose up. Je zult nu een download zien en daarna een lange lijst met opstart regels.

!!! failure Foutmelding? Dit kan een aantal oorzaken hebben. Voorkomend zijn: - je zit niet in de juiste directory: geef dit commando in de db directory, alleen daar werkt het - je docker engine draait niet. Herstart docker desktop of de service (Mac) - je werkt niet met voldoende rechten. Windows 10+: open een Powershell met adminstrator rights. Ga naar de juiste directory met het cd commando. Voer daar nogmaals docker compose up uit.

Succes

Je database draait nu. Ga in de terminal terug naar de main directory, met het commando $ cd .. (de 2 puntjes betekenen: 1 niveau hoger).