PostgreSQL in Python met Psycopg2
Op deze pagina:
In Python kun je PostgreSQL gebruiken met psycopg2, de PostgreSQL connector voor Python. vanzelfsprekend moet je Python en PostgreSQL op je systeem hebben staan. Psycopg2, de Postgres connector voor Python is beschikbaar als een PyPI-pakket dat je kunt installeren met pip.
Hoe verbinding te maken met een PostgreSQL-database
Zorg ervoor dat uw PostgreSQL-databaseserver actief is, en je een database hebt waar je verbinding mee kunt maken.
Als je nog geen database hebt, dan kun je die aanmaken met pgAdmin of psql.
De functie connect() in Psycopg2
Om verbinding t emekane met een PostgreSQL database, heeft de connect() functie van psycopg2 enekele gegevens nodig die je het beste in een apart bestand kan plaatsen of je moet ze instellen als omgevingsvariabelen en die opvragen.
Als voorbeeld een bestand config.py met de volgende gegevens:
dbnaam='test'
gebruiker='username'
wachtwoord='password'
dbhost='localhost'
poort=5432
Natuurlijk moet je in dit bestand de 'dummy' gegevens vervangen door de echte gegevens die bij je database horen.
Verbinden met de database kan dan met:
import psycopg2
from config import dbnaam, gebruiker, wachtwoord, dbhost, poort
db_connection = psycopg2.connect(dbname=dbnaam,
user=gebruiker,
password=wachtwoord,
host=dbhost,
port=poort)
print("Verbinden met de database is gelukt.")
In het bovenstaande codefragment:
- dbname is de naam van de database waarmee je verbinding wilt maken.
- gebruiker en wachtwoord zijn de gebruikersnaam en het wachtwoord die nodig zijn voor de authenticatie.
- host is het IP-adres van de server waarop je database draait ('localhost' in dit geval).
- poort verwijst naar het poortnummer waar de server naar luistert voor binnenkomende verbindingsverzoeken naar de database. De standaardwaarde is 5432.
Verbindingsfouten afhandelen
Bij fouten bij het maken van een verbinding met de database geeft Psycopg2 een OperationalError. Die kun je afvangen met een try-except blok. Na afloop moet je de verbinding weer sluiten. Als de verbinging is gesloten kun je geen queries meer uitvoeren.
import psycopg2
from psycopg2 import OperationalError
from config import dbnaam, gebruiker, wachtwoord, dbhost, poort
try:
db_connection = psycopg2.connect(dbname=dbnaam,
user=gebruiker,
password=wachtwoord,
host=dbhost,
port=poort)
print("Verbinden met de database is gelukt.")
except OperationalError:
print("Verbinden met de database is niet gelukt.")
finally:
if db_connection:
db_connection.close()
print("Verbinding gesloten.")
Het kan ook met 'with' blokken:
# psycopg2-tutorial/main2.py
try:
with psycopg2.connect(dbname=dbnaam,
user=gebruiker,
password=wachtwoord,
host=dbhost,
port=poort) as db_connection:
print("Verbinden met de database is gelukt.")
with db_connection.cursor() as db_cursor:
... # queries uitvoeren
except OperationalError:
print("Verbinden met de database is niet gelukt.")
finally:
if db_connection:
db_connection.close()
print("Verbinding gesloten.")
Het cursorobject
Er is nog één stap voordat je query's kunt uitvoeren: het maken van een databasecursor. Cursors kun je vergelijken met bestandshandlers. Hiermee kun je databases opvragen en resultaten ophalen, net zoals je met bestandshandlers I/O-bewerkingen op bestanden kan uitvoeren. Zodra je een cursorobject hebt, kunt je er methoden op aanroepen om de database op te vragen en de resultaten van de query op te halen.
Een cursorobject maken:
db_cursor = db_connection.cursor()
Voorbeeld van een INSERT opdracht, de tabel heet hier 'adresboek' en de velden (kolommen) zijn 'naam', 'stad' en 'beroep':
invoegen = "INSERT INTO adresboek (naam, stad, beroep) VALUES (%s, %s, %s);"
waarde = ('John Lee Hooker','Amsterdam','Fotograaf')
db_cursor.execute(invoegen, waarde)
Om transacties daadwerkelijk door te voeren op de database, moet je een commit() op het verbindingsobject uitvoeren, of autoconmmit aanzetten.
db_connection.autocommit = True
Als je met een query gegevens ophaalt, dan kun je ze opvragen met fetchone(), fethmany() of fetchall(). De record worden teruggegeven als tuples.
Eén record opvragen:
db_cursor.execute("SELECT * FROM adresboek;")
print(db_cursor.fetchone())
Meerdere records tegelijk opvragen, in dit geval 10:
for record in db_cursor.fetchmany(10):
print(record)
Alle resterende records opvragen:
for record in db_cursor.fetchall():
print(record)