0%

Eine Python-Schnittstelle um die Datenbank legen

Die Verantwortung für die Verbindung beim aufrufenden Code lassen

Hier ist der vollständige Lebenszyklus einer Verbindung:

show_available_items
    opens connection
    passes connection to list_available_items
    uses returned rows
    closes connection

Die Funktion, die die gesamte Operation kennt, kann entscheiden, wann die Verbindung nicht mehr gebraucht wird. Lies diesen benannten Aufrufer von oben nach unten:

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 öffnet eine konfigurierte Verbindung. Es übergibt dasselbe Objekt an list_available_items(connection), verwendet die Zeilen und schließt einmal in finally. Die Klausel finally stellt sicher, dass auch dann geschlossen wird, wenn das Lesen oder Umwandeln der Zeilen eine Ausnahme auslöst.

Keine der kleineren Datenbankfunktionen ist für diesen vollständigen Lebenszyklus verantwortlich. open_database erstellt und konfiguriert eine Verbindung und übergibt sie dann offen an den aufrufenden Code. list_available_items verwendet die übergebene Verbindung, weiß aber nicht, ob der aufrufende Code anschließend eine weitere Abfrage ausführen möchte. In einer dieser Funktionen zu schließen würde das Kombinieren erschweren oder einfach die nächste Operation kaputtmachen.

Für den Beispielkatalog erzeugt der benannte Aufruf:

show_available_items(database_path) -> ['IT-100', 'IT-200', 'IT-400', 'IT-500']
connection closed by caller: yes

Du musst catalog_db.py hier nicht ändern. Der benannte Aufrufer macht die Verantwortung sichtbar, bevor du den Rückgabewert verbesserst und Befehle hinzufügst. Diese Funktionen können jetzt eine Verbindung annehmen, ohne zu raten, wer sie schließen wird.

Welche Funktion ist im gezeigten Aufruf für das Schließen der Verbindung verantwortlich?