Python en SQL¶
Wanneer jij data uit je database wil halen maak je gebruik van SQL, net als jij dat kan, kan Python dat ook.
Op deze pagina ga je leren hoe je vanuit Python een verbinding kan maken met je MySQL Database en hoe je vervolgens data in je database kan stoppen en data uit je database kunt halen.
Verbinden met je database¶
Binnen je applicatie moet je eerste verbinding maken met je database voordat je queries kan uitvoeren op je database. Voorkom dat je telkens een nieuwe verbinding maakt, maak houd de verbinding open zolang je applicatie draait.
Benodigde Python package¶
In het project ‘HBO-ICT x Studiekiezers’ staat Flask-MySQLdb al in requirements.txt. Omdat je met Docker werkt, worden de requirements automatisch tijdens de Docker build geïnstalleerd. Je hoeft dus lokaal geen pip install te draaien.
Tip: Flask-MySQLdb levert de MySQLdb-binding, waardoor je in code gewoon import MySQLdb kunt gebruiken.
Eenvoudige connectie-functie¶
Onderstaande functie maakt een verbinding met MySQL/MariaDB. Je ziet deze aanpak ook terug in het starterproject.
import MySQLdb
def db_connect(host, user, password, database):
try:
connection = MySQLdb.connect(
host=host,
user=user,
password=password,
db=database,
)
return connection
except MySQLdb.Error as e:
print(f"Error connecting to the database: {e}")
return None
Gebruik met omgevingsvariabelen (zoals in Flask):
import os
db = db_connect(
host=os.getenv('MYSQL_HOST', 'mariadb'),
user=os.getenv('MYSQL_USER', 'root'),
password=os.getenv('MYSQL_PASSWORD', ''),
database=os.getenv('MYSQL_DATABASE', '')
)
Belangrijk:
- Houd één verbinding (
db) aan zolang je app draait (zoals bij Flask start). - Maak per query een cursor en sluit die na gebruik.
SELECT-queries uitvoeren¶
Nu je een database verbinding hebt (de variabele db die je hebt gemaakt in de vorige sectie), kan je queries uitvoeren op je database.
Wanneer je bijvoorbeeld een tabel ‘users’ hebt en je wilt hieruit de eerste rij ophalen dan kan je dat als volgt doen:
Als je alle rijen uit de tabel ‘users’ wilt ophalen dan kan je dat als volgt doen:
cursor = db.cursor()
cursor.execute("SELECT * FROM users")
users = cursor.fetchall()
for user in users:
print(user)
Wil je alle gebruikers ophalen met een bepaalde naam dan kan je dat als volgt doen:
cursor = db.cursor()
cursor.execute("SELECT * FROM users WHERE name = %s", ("Bas",))
users = cursor.fetchall()
for user in users:
print(user)
Wil je van deze gebruikers netjes de naam printen dan kan je dat als volgt doen:
cursor = db.cursor()
cursor.execute("SELECT name FROM users WHERE name = %s", ("Jorrit",))
users = cursor.fetchall()
for user in users:
print(user[0])
Of nog netter:
cursor = db.cursor()
cursor.execute("SELECT name FROM users WHERE name = %s", ("Jorrit",))
users = cursor.fetchall()
for (name,) in users:
print(name)
INSERT queries uitvoeren¶
Wanneer je data in je database wilt stoppen, dan kan je dat als volgt doen:
cursor = db.cursor()
cursor.execute("INSERT INTO users (name) VALUES (%s)", ("Jorrit",))
db.commit()
Belangrijk is dat je bij mutaties (inserts, updates, …) je database commit. Dit doe je met de commit() methode.