LU06f - DAO-Klassen und Datenmodelle

DAO steht für “Data Access Object”. Ein DAO ist ein Objekt, das eine Schnittstelle zu einer Datenbank bereitstellt. In Flask können DAO-Klassen verwendet werden, um die Logik für den Datenbankzugriff zu kapseln. Zusätzlich zu DAO-Klassen können Datenmodelle wie die ShoppingItem-Klasse verwendet werden, um die Datenstruktur zu repräsentieren.

ShoppingItem-Klasse

Die ShoppingItem-Klasse repräsentiert die Datenstruktur eines Einkaufsartikels. Sie enthält Attribute wie item_id, item_name und quantity. Anstatt manuell eine init-Methode und andere spezielle Methoden zu schreiben, können wir die @dataclass-Dekorator verwenden, um eine einfachere und sauberere Repräsentation unserer ShoppingItem-Klasse zu erhalten. Dies ist besonders nützlich, wenn die Klasse hauptsächlich zur Speicherung von Daten verwendet wird.

from dataclasses import dataclass
 
@dataclass
class ShoppingItem:
    item_id: int
    item_name: str
    quantity: int

Beispiel für eine DAO-Klasse

Nachfolgend finden Sie ein Beispiel für eine DAO-Klasse, die CRUD-Operationen (Create, Read, Update, Delete) für eine “shopping_items”-Tabelle durchführt und die ShoppingItem-Klasse verwendet.

class ShoppingItemDao:
    def __init__(self, db_file):
        self.conn = sqlite3.connect(db_file, check_same_thread=False)
        self.cursor = self.conn.cursor()
 
    def create_table(self):
        self.cursor.execute('''CREATE TABLE IF NOT EXISTS shopping_items (item_id INTEGER PRIMARY KEY, item_name TEXT, quantity INT)''')
        self.conn.commit()
 
    def add_item(self, item):
        self.cursor.execute("INSERT INTO shopping_items (item_name, quantity) VALUES (?, ?)", (item.item_name, item.quantity))
        self.conn.commit()
 
    def get_item(self, item_id):
        self.cursor.execute("SELECT * FROM shopping_items WHERE item_id = ?", (item_id,))
        row = self.cursor.fetchone()
        if row:
            return ShoppingItem(row[0], row[1], row[2])
        return None
 
    def get_all_items(self):
        self.cursor.execute("SELECT * FROM shopping_items")
        rows = self.cursor.fetchall()
        return [ShoppingItem(row[0], row[1], row[2]) for row in rows]
 
    def update_item(self, item):
        self.cursor.execute("UPDATE shopping_items SET item_name = ?, quantity = ? WHERE item_id = ?", (item.item_name, item.quantity, item.item_id))
        if self.cursor.rowcount > 0:
            self.conn.commit()
            return True
        return False
 
    def delete_item(self, item_id):
        self.cursor.execute("DELETE FROM shopping_items WHERE item_id = ?", (item_id,))
        if self.cursor.rowcount > 0:
            self.conn.commit()
            return True
        return False
 
    def close(self):
        self.conn.close()

Beispiel zur Verwendung der ShoppingItemDao-Klasse

Nach der Definition der ShoppingItemDao- und ShoppingItem-Klassen können wir sie in unserem Code verwenden, um Einkaufsartikel in der Datenbank zu verwalten.

# DAO-Instanz erstellen und Tabelle erstellen
dao = ShoppingItemDao('shopping_example.db')
dao.create_table()
 
# Neuen Einkaufsartikel hinzufügen
new_item = ShoppingItem(None, 'Apple', 5)
dao.add_item(new_item)
 
# Einkaufsartikel abrufen
retrieved_item = dao.get_item(1)
if retrieved_item:
    print(f"Item ID: {retrieved_item.item_id}, Item Name: {retrieved_item.item_name}, Quantity: {retrieved_item.quantity}")
 
# Einkaufsartikel aktualisieren
retrieved_item.quantity = 7
dao.update_item(retrieved_item)
 
# Einkaufsartikel löschen
dao.delete_item(1)
 
# Verbindung schließen
dao.close()

© Kevin Maurizi