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.

Tutorial
1. Project Voorbereidingen
- Maak een project folder waarin je zult werken, bijvoorbeeld
python_sensor_query. - 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.
-
Installeer de volgende packages via pip in je virtuele omgeving:
mariadbvoor het verbinden met de MariaDB database.
Gebruik de volgende command in je terminal om deze package te installeren:
pip install mariadb
-
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
- Host:
-
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. -
Extra info: De structuur van onze Weerwijs database is terug te vinden in het bestand
software/binnenunit/database_structure.txtop 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
- Importeer de
mariadbmodule in je Python script.
import mariadb
- Gebruik
mariadb.connect()om verbinding te maken met de database, geef de login gegevens door als parameters.
Je kan vervolgensconnectiongebruiken 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"
)
- Verbetering op stap 2: het is praktischer om een functie te maken die de verbinding met de database tot stand brengt.
Deze functie zal mettry-exceptblokken 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
- 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()
- 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!
- 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
- 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()
- 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;
- Voer de query uit met
cursor.execute(), en geef de SQL query als parameter door.
cursor.execute("SELECT * FROM sensor WHERE id = 1;")
- Gebruik
cursor.fetchall()om alle resultaten van de query op te halen en op te slaan in een variabele.
results = cursor.fetchall()
- Print de resultaten om te zien wat er is opgehaald uit de database.
print(results)
- 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))]
- 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
- 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;
- Maak een nieuwe functie aan die de parameter
connectionaccepteert.
Zorg ervoor dat deze functie deze nieuwe SQL query uitvoert en de resultaten print.
Netzoals je geleerd hebt in het vorige deel met decursor,executeenfetchall.
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)
- Maak de functie variabel, zodat je de
sensor_idals parameter kan doorgeven.
Je kan de1bijWHERE s.id = 1;vervangen door een parameter, bijvoorbeeldWHERE s.id = ?;
Vervolgens desensor_idals tweede parameter meegeven incursor.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)
- Roep de functie aan en geef een
sensor_iddoor om de gegevens van die specifieke sensor op te vragen.
get_sensor_data(connection, 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
- Dit is een voorbeeld SQL query waarmee je de laatste measurement data van een specifieke sensor kan opvragen.
Desensor_idwordt 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
);
- Maak een nieuwe functie aan die deze query uitvoert en de resultaten print.
Zoals je geleerd hebt in de vorige delen met decursor,execute,fetchallen parameter voor desensor_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)
- 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: