Bouw een Python-interface rond de database
Laat de aanroeper de verbinding beheren
Dit is de volledige levenscyclus van één verbinding:
show_available_items
opens connection
passes connection to list_available_items
uses returned rows
closes connection
De functie die de volledige bewerking kent, kan bepalen wanneer de verbinding niet meer nodig is. Lees deze aanroepende functie van boven naar beneden:
def show_available_items(database_path):
connection = open_database(database_path)
try:
result, rows = list_available_items(connection)
asset_tags = []
for row in rows:
asset_tags.append(row["asset_tag"])
return asset_tags
finally:
connection.close()
show_available_items(database_path)
show_available_items opent één geconfigureerde verbinding. De functie geeft hetzelfde object door aan list_available_items(connection), gebruikt de rijen en sluit één keer in finally. De clausule finally zorgt ervoor dat de verbinding ook wordt gesloten als het lezen of omzetten van de rijen een exception veroorzaakt.
Geen van de kleinere databasefuncties beheert die volledige levenscyclus. open_database maakt een verbinding aan, configureert haar en geeft haar open aan de aanroeper door. list_available_items gebruikt de meegegeven verbinding, maar weet niet of de aanroeper hierna nog een query wil uitvoeren. Sluiten binnen een van die functies zou het combineren van bewerkingen lastig maken of de volgende bewerking laten mislukken.
Voor de voorbeeldcatalogus levert de getoonde aanroep dit op:
show_available_items(database_path) -> ['IT-100', 'IT-200', 'IT-400', 'IT-500']
connection closed by caller: yes
Je hoeft catalog_db.py hier niet te veranderen. De getoonde aanroeper maakt de verantwoordelijkheid zichtbaar voordat je de terugkeerwaarde verfijnt en opdrachten toevoegt. Die functies kunnen nu een verbinding aannemen zonder te raden wie haar sluit.
Welke functie is verantwoordelijk voor het sluiten van de verbinding in de getoonde aanroep?