Cursus
Data staat centraal in vrijwel elke digitale applicatie die je kunt bedenken. Van mobiele apps en computerspellen tot banktools en autonome voertuigen: alles draait om data. Waar wordt al die data opgeslagen? Het antwoord: in databases.
Een database is een geordende verzameling gestructureerde data, meestal elektronisch opgeslagen in een computersysteem. Ondanks de recente ontwikkeling van nieuwe typen databases (bedoeld om de toenemende hoeveelheid en variabiliteit van data aan te kunnen), wordt wereldwijd nog steeds een aanzienlijk deel van de data opgeslagen in zogeheten relationele databases. Relationele databases slaan data op als verzamelingen vooraf gedefinieerde tabellen met rijen en kolommen die met elkaar verbonden zijn via een of meer relaties.
Data uit deze databases kunnen ophalen en verwerken is een essentiële vaardigheid in de datasector en de vraag ernaar groeit. De standaardmanier om databases te maken en te beheren is SQL (Structured Query Language). SQL vormt de basis van enkele van de populairste relationele databases op de markt, zoals PostgreSQL, Microsoft SQL Server, MySQL en SQLite
In deze tutorial focussen we op PostgreSQL-databases en hoe je die kunt maken, ermee kunt verbinden en beheren met Python. De SQL-Python-combinatie is een van de basisvaardigheden die je onder de knie moet krijgen tijdens je data science-reis. Om Python met PostgreSQL te verbinden, gebruiken we het psycopg2-pakket, de populairste PostgreSQL-database-adapter voor Python. Klaar voor de uitdaging? Laten we beginnen!
PostgreSQL begrijpen
PostgreSQL is een lichtgewicht, gratis en open-source relationele database. Dankzij de bewezen architectuur, betrouwbaarheid, dataintegriteit en soepele integratie met andere populaire programmeertalen, zoals Python en R, is PostgreSQL enorm geliefd in de industrie en wordt het gebruikt door bedrijven van elke omvang en uit alle regio’s.
PostgreSQL gebruikt en breidt de SQL-taal uit met veel functies die de meest complexe dataworkloads veilig opslaan en opschalen.
Om PostgreSQL te gebruiken, moet je het eerst op je computer installeren. Op de officiële site van PostgreSQL vind je tal van kant-en-klare pakketten en installers, en een broncode-archief voor verschillende platforms en use-cases.
Voor deze tutorial gebruiken we de Postgres App, een eenvoudige, native macOS-app die alle functies bevat die je nodig hebt om met PostgreSQL te starten. Houd er wel rekening mee dat alle andere beschikbare pakketten even geldig zijn en dat de PostgreSQL-syntaxis om queries uit te voeren overal hetzelfde is.
Wil je meer weten over PostgreSQL? Bekijk dan onze Beginnersgids voor PostgreSQL en het ruime aanbod aan SQL-cursussen.
psycopg2 begrijpen
Om verbinding te maken met een database die al op je systeem of op internet is aangemaakt, moet je Python vertellen hoe deze te vinden. Met andere woorden: je moet Python laten weten dat de database waarin je geïnteresseerd bent, een PostgreSQL-database is.
In Python heb je meerdere opties om uit te kiezen. In dit geval gebruiken we psycopg2, waarschijnlijk de populairste PostgreSQL-database-adapter voor Python. Psycopg2 vereist enkele vereisten om goed op je computer te werken. Zodra je die hebt geïnstalleerd (lees de documentatie voor meer informatie), kun je psycopg2 installeren zoals elk ander Python-pakket:
pip install psycopg2
Als je psycopg2 direct en eenvoudig wilt gebruiken, kun je ook psycopg2-binary installeren, een standalone-versie van het pakket die geen compiler of externe libraries vereist. Dit is de voorkeursinstallatie voor nieuwe gebruikers.
pip install psycopg2-binary
Gebruik je Python in een Conda-omgeving, installeer psycopg2 dan via de Anaconda-installatie:
conda install -c anaconda psycopg2
Nu je alles klaar hebt staan, maken we je eerste verbinding met je PostgreSQL-sessie met psycopg2!
Python verbinden met PostgreSQL
Om Python te gebruiken om te communiceren met een PostgreSQL-database, moeten we een verbinding maken. Dit doen we met de connect()-functie van psycopg2, die een nieuwe databasesessie creëert en een nieuwe connectie-instantie teruggeeft.
Voor deze tutorial verbinden we met een database genaamd “datacamp_courses” die lokaal wordt gehost.
conn = psycopg2.connect(database = "datacamp_courses",
user = "datacamp",
host= 'localhost',
password = "postgresql_tutorial",
port = 5432)
De basis-parameters voor de verbinding zijn:
- database. De databasenaam.
- user. Gebruikersnaam die nodig is voor authenticatie.
- password. Wachtwoord voor authenticatie.
- host. Adres van de databaseserver (in ons geval wordt de database lokaal gehost, maar dit kan ook een IP-adres zijn).
- port. Poortnummer voor de verbinding (standaard 5432 als niet opgegeven).
Een tabel maken in PostgreSQL
Tijd om je eerste tabel te maken in de datacamp_courses-database. We willen een tabel maken met informatie over enkele cursussen in de DataCamp-catalogus. De tabel heeft het volgende schema:

De specificatie vertelt ons het een en ander over de kolommen van de tabel. De primaire sleutel van de tabel moet course_id zijn, en het gegevenstype moet een integer zijn. Een primaire sleutel is een beperking die afdwingt dat de kolomwaarden niet-null en uniek zijn. Hiermee kun je een specifieke instantie of set instanties in de tabel eenduidig identificeren.
De overige kolommen geven informatie over de cursusnaam, de naam van de cursusinstructeur en het onderwerp van de cursus.
Voordat we de tabel maken, is het belangrijk om uit te leggen hoe de connectie-instantie die je zojuist hebt gemaakt werkt. In essentie kapselt de connectie een databasesessie in en kun je er SQL-commando’s en -queries mee uitvoeren, zoals SELECT, INSERT, CREATE, UPDATE of DELETE, met de cursor()-methode, en wijzigingen blijvend maken met de commit() -methode.
Zodra je de cursor-instantie hebt aangemaakt, kun je commando’s naar de database sturen met de execute()-methode en data uit een tabel ophalen met fetchone(), fetchmany() of fetchall().
Tot slot is het belangrijk om de cursor en de verbinding met de database te sluiten zodra je klaar bent. Anders blijven ze serverresources vasthouden. Gebruik hiervoor de close() -methode.
Hieronder vind je de code om de datacamp_courses-tabel te maken:
# Open a cursor to perform database operations
cur = conn.cursor()
# Execute a command: create datacamp_courses table
cur.execute("""CREATE TABLE datacamp_courses(
course_id SERIAL PRIMARY KEY,
course_name VARCHAR (50) UNIQUE NOT NULL,
course_instructor VARCHAR (100) NOT NULL,
topic VARCHAR (20) NOT NULL);
""")
# Make the changes to the database persistent
conn.commit()
# Close cursor and communication with the database
cur.close()
conn.close()
Dit is een heel eenvoudig voorbeeld van hoe je tabellen in PostgreSQL aanmaakt, maar het kan een stuk complexer worden. Wil je meer leren over het aanmaken van een PostgreSQL-database en de structuur, datatypen en normalisatie verkennen? Bekijk dan onze cursus Creating PostgreSQL Database.
Basis-PostgreSQL-queries uitvoeren in Python
De datacamp_courses-tabel is klaar; tijd om SQL te gebruiken voor een paar basisqueries!
INSERT
Je hebt misschien gemerkt dat de tabel nog geen waarden heeft. Om records in de datacamp_courses-tabel te maken, gebruiken we het INSERT-commando.
cur = conn.cursor()
cur.execute("INSERT INTO datacamp_courses(course_name, course_instructor, topic) VALUES('Introduction to SQL','Izzy Weber','Julia')");
cur.execute("INSERT INTO datacamp_courses(course_name, course_instructor, topic) VALUES('Analyzing Survey Data in Python','EbunOluwa Andrew','Python')");
cur.execute("INSERT INTO datacamp_courses(course_name, course_instructor, topic) VALUES('Introduction to ChatGPT','James Chapman','Theory')");
cur.execute("INSERT INTO datacamp_courses(course_name, course_instructor, topic) VALUES('Introduction to Statistics in R','Maggie Matsui','R')");
cur.execute("INSERT INTO datacamp_courses(course_name, course_instructor, topic) VALUES('Hypothesis Testing in Python','James Chapman','Python')");
conn.commit()
cur.close()
conn.close()
De resulterende tabel ziet er zo uit:
|
course_id |
course_name |
course_instructor |
topic |
|
1 |
Izzy Weber |
Julia |
|
|
2 |
EbunOluwa Andrew |
Python |
|
|
3 |
James Chapman |
Theory |
|
|
4 |
Maggie Matsui |
R |
|
|
5 |
James Chapman |
Python |
SELECT
Data lezen uit SQL-databases is waarschijnlijk iets wat je vaak zult doen in je data science-reis. Dit noemen we doorgaans een SELECT-query. Laten we nu kijken hoe het staat met de tabel datacamp_courses.
We roepen de klassieke instructie SELECT * FROM database_name aan om alle data in de tabel te lezen. Vervolgens gebruiken we de fetchall()-methode om alle beschikbare rijen op te halen. Merk op dat PostgreSQL automatisch een numerieke index maakt voor de course_id-kolom.
cur = conn.cursor()
cur.execute('SELECT * FROM datacamp_courses;')
rows = cur.fetchall()
conn.commit()
conn.close()
for row in rows:
print(row)
(1, 'Introduction to SQL', 'Izzy Weber', 'Julia')
(2, 'Analyzing Survey Data in Python', 'EbunOluwa Andrew', 'Python')
(3, 'Introduction to ChatGPT', 'James Chapman', 'Theory')
(4, 'Introduction to Statistics in R', 'Maggie Matsui', 'R')
(5, 'Hypothesis Testing in Python', 'James Chapman', 'Python')
UPDATE
Data bevat vaak fouten. Je hebt in de vorige sectie misschien gezien dat het onderwerp bij de cursus “Introduction to SQL” Julia is. Na het checken van de cursusinformatie ontdekten we de fout. We moeten dit wijzigen naar “SQL”. Dat kan met de UPDATE-instructie, als volgt:
cur = conn.cursor()
cur.execute("UPDATE datacamp_courses SET topic = 'SQL' WHERE course_name = 'Introduction to SQL';")
conn.commit()
conn.close()
DELETE
Tot slot wil je misschien een van de records in je tabel verwijderen. Laten we bijvoorbeeld de cursus Introduction to Statistics in R verwijderen:
cur = conn.cursor()
cur.execute("""DELETE from datacamp_courses WHERE course_name = 'Introduction to Statistics in R'""");
conn.commit()
cur.close()
Geavanceerde PostgreSQL-queries in Python
In de vorige sectie bekeken we de meest basale SQL-queries. Maar er valt nog veel meer te leren. Laten we wat geavanceerdere queries bekijken.
ORDER BY
Stel, je wilt je database sorteren op de naam van de instructeur. Dan kun je de ORDER BY-instructie gebruiken:
cur = conn.cursor()
cur.execute('SELECT * FROM datacamp_courses ORDER BY course_instructor')
rows = cur.fetchall()
for row in rows:
print(row)
(2, 'Analyzing Survey Data in Python', 'EbunOluwa Andrew', 'Python')
(1, 'Introduction to SQL', 'Izzy Weber', 'SQL')
(3, 'Introduction to ChatGPT', 'James Chapman', 'Theory')
(4, 'Hypothesis Testing in Python', 'James Chapman', 'Python')
GROUP BY
Je wilt misschien aggregatiefuncties uitvoeren binnen verschillende datagroepen. Je bent bijvoorbeeld geïnteresseerd in het berekenen van het aantal cursussen per cursusinstructeur. Dit soort bewerkingen kun je doen met de GROUP BY-functie.
cur = conn.cursor()
cur.execute('SELECT course_instructor, COUNT(*) FROM datacamp_courses GROUP BY course_instructor')
rows = cur.fetchall()
for row in rows:
print(row)
('James Chapman', 2)
('Izzy Weber', 1)
('EbunOluwa Andrew', 1)
JOIN
Tot nu toe hebben we alleen met de tabel datacamp_course gewerkt. Maar je benut pas echt het volledige potentieel van relationele databases, zoals PostgreSQL, wanneer je met meerdere tabellen tegelijk werkt.
Het tovermiddel om meerdere tabellen te combineren is de JOIN-operatie. Stel dat we een tweede tabel in onze database hebben, programming_languages, met basisinformatie over de top programmeertalen voor data science, inclusief de naam, de positie in de TIOBE-index en het aantal cursussen over de programmeertaal op Datacamp. De tabel ziet er zo uit:
|
language_id |
language_name |
course_number |
tiobe_ranking |
|
1 |
SQL |
31 |
8 |
|
2 |
Python |
157 |
1 |
|
3 |
R |
132 |
16 |
|
4 |
Julia |
2 |
33 |
|
5 |
Scala |
1 |
38 |
Stel dat je de twee tabellen wilt samenvoegen om de cursusinformatie te combineren met de positie van de taal in de TIOBE-index. We gebruiken een INNER JOIN om alleen de informatie op te halen van de programmeertalen die voorkomen in de tabel datacamp_course.
cur = conn.cursor()
cur.execute("""SELECT course_name, course_instructor, topic, tiobe_ranking
FROM datacamp_courses
INNER JOIN programming_languages
ON datacamp_courses.topic = programming_languages.language_name""")
rows = cur.fetchall()
for row in rows:
print(row)
('Introduction to SQL', 'Izzy Weber', 'SQL', 8)
('Analyzing Survey Data in Python', 'EbunOluwa Andrew', 'Python', 1)
('Hypothesis Testing in Python', 'James Chapman', 'Python', 1)
Dit is slechts één voorbeeld, maar de mogelijkheden van SQL-joins zijn eindeloos — een absolute must-know. Onze cursus, tutorial en cheatsheet over joins helpen je op weg.
Aan de slag met SQLAlchemy
Psycopg2 is een geweldig hulpmiddel om met PostgreSQL-databases te verbinden. Maar wat als je moet werken met databases die op verschillende SQL-databases zijn gehost, zoals Oracle en MySQL? In zulke scenario’s is het vaak beter om een tool te gebruiken die met verschillende typen SQL-databases kan verbinden. SQLAlchemy is daarvoor een uitstekende kandidaat.
Eenvoudig gezegd stelt SQLAlchemy gebruikers in staat om databases met Python te verbinden, SQL-queries uit te voeren via objectgeoriënteerd programmeren en de workflow te stroomlijnen.
Hoewel de syntaxis verschilt van psycopg2, kun je er vrijwel hetzelfde mee doen. Hieronder vind je een voorbeeld om een engine te maken die verbinding maakt met onze datacamp_courses-datasets, en om alle data in de datacap_course-tabel te lezen
import sqlalchemy as db
engine = db.create_engine("postgresql://datacamp@localhost:5432/datacamp_courses")
conn = engine.connect()
output = conn.execute("SELECT * FROM datacamp_courses")
print(output.fetchall())
conn.close()
[(3, 'Introduction to ChatGPT', 'James Chapman', 'Theory'),
(5, 'Hypothesis Testing in Python', 'James Chapman', 'Python'),
(2, 'Analyzing Survey Data in Python', 'EbunOluwa Andrew', 'Python'),
(1, 'Introduction to SQL', 'Izzy Weber', 'SQL')]
SQLAlchemy is nog zo’n tool die de moeite waard is om te leren. Wil je een idee krijgen hoe de tool werkt? Bekijk dan onze SQLALchemy-tutorial.
PostgreSQL gebruiken in DataCamp DataLab
Bij DataCamp werken we hard om data science makkelijker en voor iedereen toegankelijk te maken. Dat was de reden achter de creatie van DataCamp DataLab, een cloudgebaseerd notebook speciaal ontworpen voor data science. Je kunt DataCamp DataLab zien als een mix van Jupyter Notebook en Google Docs, waarmee gebruikers individueel of samen code kunnen schrijven, data kunnen analyseren en inzichten kunnen delen.
DataLab verbinden met PostgreSQL-databases, maar ook met andere SQL-databases, is extreem eenvoudig. DataLab laat je veilig verbinding maken met databronnen. Tegelijkertijd kun je naadloos verdergaan met je data-analyse in Python of R. Je hoeft alleen een integratie aan te maken via een eenvoudig, no-code proces, waarin je je verbindingsgegevens invoert.
Wil je de integratie proberen maar heb je geen PostgreSQL-database om mee te verbinden? Gebruik dan een van onze voorbeeld-PostgreSQL-databases!
Nieuwsgierig naar DataCamp DataLab? Bekijk dit artikel om meer te weten te komen over dit notebook van de volgende generatie voor data science.
Conclusie
Goed gedaan! In deze tutorial heb je kennisgemaakt met PostgreSQL en geleerd hoe je databases beheert zonder Python te verlaten, met het psycopg2-pakket. Maar dit is nog maar het begin. SQL is een van de meest gebruikte programmeertalen in data science. Het is ook vrij eenvoudig te leren, dus geen excuses.
Gelukkig zit je bij Datacamp goed. Hier zijn enkele resources die je helpen om vloeiend te worden in PostgreSQL en SQL in het algemeen:
FAQs
Wat is het verschil tussen psycopg2 en psycopg2-binary?
psycopg2 is het bronpakket en vereist dat een C-compiler en PostgreSQL-clientbibliotheken op je systeem zijn geïnstalleerd. psycopg2-binary is een vooraf gecompileerde versie die alles bevat wat je nodig hebt om snel te starten. Het is geweldig voor ontwikkeling en om te leren, maar wordt niet aanbevolen voor productieomgevingen vanwege mogelijke binaire incompatibiliteiten.
Hoe behandel ik databaseverbindingsfouten in Python?
Je kunt verbindingsgerelateerde fouten opvangen en afhandelen met Python’s try-except-blokken. Bijvoorbeeld:
import psycopg2
from psycopg2 import OperationalError
try:
conn = psycopg2.connect(
database="datacamp_courses",
user="datacamp",
password="postgresql_tutorial",
host="localhost",
port=5432
)
except OperationalError as e:
print(f"An error occurred: {e}")
Zo kan je script netjes falen en desnoods zelfs opnieuw proberen te verbinden.
Hoe maak ik verbinding met een externe PostgreSQL-database in plaats van een lokale?
Om verbinding te maken met een externe PostgreSQL-database, vervang je localhost door het IP-adres of de domeinnaam van de externe server. Zorg ervoor dat:
- De databaseserver externe verbindingen toestaat.
- De juiste poort (meestal 5432) openstaat in de firewall.
- Je PostgreSQL-bestand
pg_hba.confis geconfigureerd om externe verbindingen te accepteren.
Kan ik omgevingsvariabelen gebruiken om database-inloggegevens veilig op te slaan?
Ja, het opslaan van inloggegevens als omgevingsvariabelen is veiliger dan ze hardcoden. Je kunt ze in Python benaderen met os.environ:
import os
conn = psycopg2.connect(
database=os.environ["DB_NAME"],
user=os.environ["DB_USER"],
password=os.environ["DB_PASSWORD"],
host=os.environ["DB_HOST"],
port=os.environ["DB_PORT"]
)
Gebruik lokaal tools zoals .env-bestanden met python-dotenv om dit te beheren.
Hoe voorkom ik SQL-injectieaanvallen bij het gebruik van psycopg2?
Gebruik altijd geparameteriseerde queries in plaats van stringformattering wanneer je gebruikersdata invoegt:
cur.execute("INSERT INTO datacamp_courses(course_name, course_instructor, topic) VALUES (%s, %s, %s)",
('Course Name', 'Instructor', 'Topic'))
Dit voorkomt dat kwaadwillenden schadelijke SQL-code in je queries injecteren.
Hoe werk ik meerdere rijen tegelijk bij in psycopg2?
Je kunt de methode executemany() gebruiken om efficiënt meerdere rijen in te voegen of bij te werken:
courses = [
('Course A', 'Instructor A', 'Python'),
('Course B', 'Instructor B', 'R')
]
cur.executemany("INSERT INTO datacamp_courses(course_name, course_instructor, topic) VALUES (%s, %s, %s)", courses)
Welke datatypen zijn beschikbaar in PostgreSQL, en hoe mappen ze naar Python?
Hier zijn enkele veelvoorkomende PostgreSQL-datatypen en hun Python-equivalenten:
| PostgreSQL Type | Python Equivalent |
|---|---|
| INTEGER | int |
| VARCHAR, TEXT | str |
| BOOLEAN | bool |
| DATE, TIMESTAMP | datetime.date, datetime.datetime |
| NUMERIC | decimal.Decimal |
Hoe kan ik data uit PostgreSQL naar een CSV exporteren met Python?
Je kunt de methode copy_expert() gebruiken met een SQL COPY-commando:
with open('courses.csv', 'w') as f:
cur.copy_expert("COPY datacamp_courses TO STDOUT WITH CSV HEADER", f)
Dit is handig voor het maken van back-ups of het exporteren van data voor analyse.
Kan ik Jupyter Notebook gebruiken om deze Python-PostgreSQL-commando’s uit te voeren?
Absoluut! psycopg2 werkt probleemloos in Jupyter. Zorg er wel voor dat de databaseverbinding na je queries netjes wordt gesloten, omdat Jupyter-sessies open kunnen blijven en resources verbruiken.
Wat is de beste manier om SQL-queries die falen in Python te debuggen?
Je kunt:
- De query en parameters afdrukken vóór uitvoering.
- PostgreSQL-logs gebruiken voor meer details.
psycopg2-logging inschakelen doorconnection.set_isolation_level()in te stellen of SQLAlchemy’s echo-modus te gebruiken als je die interface gebruikt.
Ik ben een freelance data-analist en werk samen met bedrijven en organisaties wereldwijd aan datascienceprojecten. Ook geef ik les in data science en heb ik meer dan twee jaar ervaring als docent. Ik schrijf regelmatig artikelen over data science in het Engels en Spaans; sommige daarvan zijn gepubliceerd op bekende platforms zoals DataCamp, Towards Data Science en Analytics Vidhya. Als data scientist met een achtergrond in politicologie en recht wil ik werken op het snijvlak van openbaar beleid, recht en technologie. Ik zet de kracht van ideeën in om innovatieve oplossingen en verhalen te ontwikkelen die helpen bij het aanpakken van urgente uitdagingen, met name de klimaatcrisis. Ik beschouw mezelf als autodidact, een eeuwige leerling en een groot voorstander van multidisciplinariteit. Het is nooit te laat om nieuwe dingen te leren.

