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)

 

Verwante artikelen