Skip to main content

Python Database Query, laatste sensor data opvragen

Author: @edu-chainsss
Date: 12-02-2026

In deze tutorial wordt uitgelegd hoe je met Python een query uitvoert op een MariaDB database. Hierbij wordt de nadruk gelegd op het opvragen van de laatste measurement data & metadata van sensor vanuit onze Weerwijs MariaDB database. Deze tutorial is bedoeld voor beginners die willen leren hoe ze met Python kunnen communiceren met een database en specifieke data kunnen opvragen.

Docker & SQL

Tutorial​

1. Project Voorbereidingen​

  1. Maak een project folder waarin je zult werken, bijvoorbeeld python_sensor_query.
  2. Maak een virtuele omgeving aan.

2.1. Thonny:
Virtuele omgeving aanmaken in Thonny: ga naar Tools > Options > Interpreter > New virtual environment
Kies vervolgens een locatie voor je virtuele omgeving. De locatie moet een lege folder zijn, bijvoorbeeld python_sensor_query/venv.

2.2. VS Code:
Open VS Code in workspace mode, dit wilt zeggen dat je je project folder opent als workspace.
Ga hiervoor naar File > Open Folder > selecteer je project folder, bijvoorbeeld python_sensor_query.


Vervolgens kan je een virtuele omgeving aanmaken in VS Code:
Gebruik CTRL + SHIFT + P en zoek naar Python: Create Environment > kies venv > kies een geïnstaleerde interpreter.
VS Code zal zelf automatisch een venv folder aanmaken voor je virtuele omgeving.

  1. Installeer de volgende packages via pip in je virtuele omgeving:

    • mariadb voor het verbinden met de MariaDB database.

    Gebruik de volgende command in je terminal om deze package te installeren:

pip install mariadb
  1. Zorg ervoor dat je toegang hebt tot de MariaDB database, en beschikt over de volgende inloggegevens:

    • Host: localhost (of het IP-adres van de database server)
    • Port: 3306 (standaard MariaDB poort)
    • User: your_username
    • Password: your_password
    • Database: your_database_name
  2. Maak een Python script aan in je project folder, bijvoorbeeld query_sensor_data.py.
    Hierin zul je de code schrijven om de laatste sensor data op te vragen.

  3. Extra info: De structuur van onze Weerwijs database is terug te vinden in het bestand software/binnenunit/database_structure.txt op de GitHub repository. Dit kan handig zijn als je zelf een meer specifieke query wilt schrijven, maar hou je eerst aan deze voorbeelden in deze tutorial.



2. Verbinding maken met de database​

  1. Importeer de mariadb module in je Python script.
import mariadb

  1. Gebruik mariadb.connect() om verbinding te maken met de database, geef de login gegevens door als parameters.
    Je kan vervolgens connection gebruiken om queries uit te voeren op de database.
connection = mariadb.connect(
host="localhost",
port=3306,
user="your_username",
password="your_password",
database="your_database_name"
)

  1. Verbetering op stap 2: het is praktischer om een functie te maken die de verbinding met de database tot stand brengt.
    Deze functie zal met try-except blokken werken en jou een melding geven als de verbinding succesvol is of als er een fout optreedt.
def connect_to_database():
try:
connection = mariadb.connect(
host="localhost",
port=3306,
user="your_username",
password="your_password",
database="your_database_name"
)
print("Verbonden met de database!")
return connection
except mariadb.Error as e:
print(f"Fout bij verbinden met de database: {e}")
return None

  1. Roep de functie connect_to_database() aan om de verbinding te maken en sla het resultaat op in een variabele.
db_connection = connect_to_database()

  1. Test of de verbinding succesvol is gemaakt voordat je verder gaat met het uitvoeren van queries.
    Als jouw python script geen verbinding kan maken met de database, kan je geen queries uitvoeren.
    Dus is het belangrijk om dit te controleren voordat je verder gaat.
    Lukt de verbinding niet, controleer dan de inloggegevens en of de database server draait.
    Je zou het volgende moeten zien in de console als de verbinding succesvol is:
Verbonden met de database!

  1. Extra info: Als de database verbinding niet langer open moet blijven, sluit deze dan af met db_connection.close().
db_connection.close()


3. Simpele query uitvoeren, leren werken met query's​

  1. Maak een cursor object aan met db_connection.cursor().
    Voordat je een query kunt uitvoeren, moet je een cursor hebben. Deze zorgt voor de resultaten van de query.
cursor = db_connection.cursor()

  1. Dit is een simpele SQL query die alle gegevens van de sensor met id 1 ophaalt.
    Deze query zal je nodig hebben in de volgende stap waarin je deze query gaat uitvoeren in Python.
SELECT * FROM sensor WHERE id = 1;

  1. Voer de query uit met cursor.execute(), en geef de SQL query als parameter door.
cursor.execute("SELECT * FROM sensor WHERE id = 1;")

  1. Gebruik cursor.fetchall() om alle resultaten van de query op te halen en op te slaan in een variabele.
results = cursor.fetchall()

  1. Print de resultaten om te zien wat er is opgehaald uit de database.
print(results)

  1. Je zou nu de gegevens van de sensor met id 1 moeten zien in de console, zoals bijvoorbeeld:
[(1, 40, 1, 'Envisense E101-1', '1234', datetime.date(2026, 1, 15), datetime.datetime(2026, 2, 13, 7, 2, 13))]

  1. Samenvatting van stap 1-6: hieronder kan je de samengestelde functie vinden:
def simple_query(connection):
cursor = connection.cursor()
cursor.execute("SELECT * FROM sensor WHERE id = 1;")
result = cursor.fetchall()
print(result)

Je kan de functie simple_query(db_connection) aanroepen om deze query uit te voeren en de resultaten te zien.



4. Alle gegevens/metadata van een specifieke sensor opvragen​

  1. Dit is een voorbeeld SQL query waarmee je alle metadata van een specifieke sensor ophaalt, bijvoorbeeld de sensor met id 1.
    Deze query zal je nodig hebben in de volgende stap waarin je deze query gaat uitvoeren in Python.
SELECT s.id AS sensor_id,
s.name AS sensor_name,
s.installation_date,
s.last_seen,
l.name AS location_name,
l.floor,
lt.name AS location_type_name,
mc.name AS mqtt_client_name
FROM sensor s
JOIN location l ON s.location_id = l.id
JOIN location_type lt ON l.location_type_id = lt.id
JOIN mqtt_client mc ON s.mqtt_client_id = mc.id
WHERE s.id = 1;

  1. Maak een nieuwe functie aan die de parameter connection accepteert.
    Zorg ervoor dat deze functie deze nieuwe SQL query uitvoert en de resultaten print.
    Netzoals je geleerd hebt in het vorige deel met de cursor, execute en fetchall.
def get_sensor_data(connection):
cursor = connection.cursor()
query = """SELECT s.id AS sensor_id,
s.name AS sensor_name,
s.installation_date,
s.last_seen,
l.name AS location_name,
l.floor,
lt.name AS location_type_name,
mc.name AS mqtt_client_name
FROM sensor s
JOIN location l ON s.location_id = l.id
JOIN location_type lt ON l.location_type_id = lt.id
JOIN mqtt_client mc ON s.mqtt_client_id = mc.id
WHERE s.id = 1;"""

cursor.execute(query)
result = cursor.fetchall()
print(result)

  1. Maak de functie variabel, zodat je de sensor_id als parameter kan doorgeven.
    Je kan de 1 bij WHERE s.id = 1; vervangen door een parameter, bijvoorbeeld WHERE s.id = ?;
    Vervolgens de sensor_id als tweede parameter meegeven in cursor.execute().
    Door een parameter te gebruiken ipv een f-string, voorkom je SQL injectie aanvallen.
def get_sensor_data(connection, sensor_id):
cursor = connection.cursor()
query = """SELECT s.id AS sensor_id,
s.name AS sensor_name,
s.installation_date,
s.last_seen,
l.name AS location_name,
l.floor,
lt.name AS location_type_name,
mc.name AS mqtt_client_name
FROM sensor s
JOIN location l ON s.location_id = l.id
JOIN location_type lt ON l.location_type_id = lt.id
JOIN mqtt_client mc ON s.mqtt_client_id = mc.id
WHERE s.id = ?;"""

cursor.execute(query, (sensor_id,))
result = cursor.fetchall()
print(result)

  1. Roep de functie aan en geef een sensor_id door om de gegevens van die specifieke sensor op te vragen.
get_sensor_data(connection, 1)

  1. Je zou nu de gegevens van de sensor met id 1 moeten zien in de console, zoals bijvoorbeeld:
[(1, 'Envisense E101-1', datetime.date(2026, 1, 15), datetime.datetime(2026, 2, 13, 7, 2, 13), 'E101-1', 1, 'STEM', 'atheneum_envisense_E101-1')]


5. Laatste measurement data opvragen van specifieke sensor​

  1. Dit is een voorbeeld SQL query waarmee je de laatste measurement data van een specifieke sensor kan opvragen.
    De sensor_id wordt hier ook als parameter gebruikt om het variabel te maken.
SELECT m.sensor_id,
m.measurement_type_id,
mt.key AS measurement_type_key,
m.value,
m.time
FROM measurement m
JOIN measurement_type mt ON mt.id = m.measurement_type_id
WHERE m.sensor_id = ?
AND m.time = (
SELECT MAX(m2.time)
FROM measurement m2
WHERE m2.sensor_id = m.sensor_id
AND m2.measurement_type_id = m.measurement_type_id
);

  1. Maak een nieuwe functie aan die deze query uitvoert en de resultaten print.
    Zoals je geleerd hebt in de vorige delen met de cursor, execute, fetchall en parameter voor de sensor_id.
def get_latest_sensor_data(connection, sensor_id):
cursor = connection.cursor()
query = """
SELECT m.sensor_id,
m.measurement_type_id,
mt.key AS measurement_type_key,
m.value,
m.time
FROM measurement m
JOIN measurement_type mt ON mt.id = m.measurement_type_id
WHERE m.sensor_id = ?
AND m.time = (
SELECT MAX(m2.time)
FROM measurement m2
WHERE m2.sensor_id = m.sensor_id
AND m2.measurement_type_id = m.measurement_type_id
);
"""
cursor.execute(query, (sensor_id,))
result = cursor.fetchall()
print(result)

  1. Als je deze functie aanroept met een sensor_id, zou je de laatste measurement data van die sensor moeten zien in de console, zoals bijvoorbeeld:
[(1, 1, 'CO2', Decimal('1558.0000'), datetime.datetime(2026, 2, 13, 8, 2, 13)), (1, 2, 'Humidity', Decimal('63.0000'), datetime.datetime(2026, 2, 13, 8, 2, 13)), (1, 3, 'Temperature', Decimal('18.8000'), datetime.datetime(2026, 2, 13, 8, 2, 13))]


Extra informatie​

Python Script gebruiken in productie​

Je kan de andere tutoriale Docker container opzetten voor een python worker volgen om je verder uitgewerkt python script te gebruiken in een linux omgeving en in productie.
Je python script hoeft hiervooer niet specifiek een worker te zijn, bijvoorbeeld een dash plotly dashboard kan ook.
Je kan elk python script laten draaien in een docker container, zolang het script maar een oneindige loop bevat.
Zodat het script continu blijft draaien en regelmatig de database kan raadplegen voor nieuwe data.

SQL Opleiding​

Om meer te leren over SQL en queries, kan ik de volgende gratis online cursus aanbevelen: