Das wäre doch dann am Ende der main() weil, da ab da brauche ich es ja nicht mehr. Bis sich ein User neu anmeldet.__blackjack__ hat geschrieben: ↑Donnerstag 21. März 2019, 10:30 @matze1708: Das schliessen der Datenbankverbindung muss da stehen wo Du weisst das Du sie nicht mehr brauchst. Und wenn man ``with`` verwendet, üblicherweise in der Funktion/Methode in der die Verbindung auch hergestellt wird. Du hattest es ja dort bereits in einem ``finally`` stehen.
Also muss ich das Ergebnis aus__blackjack__ hat geschrieben: ↑Donnerstag 21. März 2019, 10:30 Die Abfrage der Benutzerdaten von der Datenbank wäre eine eigene Funktion. Denn das ist ja der Teil der bei Terminal und GUI gleich bleibt. Die Anzeige selbst ist unterschiedlich. Beim Terminal verwendet man ``print()`` dafür. Bei einer GUI könnte man die Daten beispielsweise in einem Drop-Down-Menü zur Auswahl zur Verfügung stellen.
Code: Alles auswählen
def kaliber_anzeigen(db, stand_id):
print()
with closing(db.cursor()) as cursor:
cursor.execute("""Select tbl_Kaliber.ID, tbl_Kaliber.KaliberLang
From tbl_Stand INNER JOIN tbl_Kaliber ON tbl_Stand.ID = tbl_Kaliber.StandID
Where tbl_Stand.ID = %s""", (stand_id,))
for row in cursor:
print( row["ID"], row["KaliberLang"])
Genau diese Menge an Zahlen muss ich verarbeiten. Diese Frage stelle ich mir gerade.__blackjack__ hat geschrieben: ↑Donnerstag 21. März 2019, 10:30 Wenn Du die Benutzereingabe auf gültige Werte einschränken möchtest, müsstest Du Funktionen bereit stellen die Dir die Möglichkeiten von der Datenbank abfragen und entsprechen die Eingabe überprüfen. Du machst das ja jetzt bereits zum Teil, nämlich ob die Eingabe eine Zahl ist. Da muss dann noch dazu kommen ob es eine Zahl aus einer Menge von vorgegebenen Zahlen ist. Und die bekommst Du ja mit der Abfrage der Kaliber.
Habe dazu erstmal die tbl_Stand erweitert mit der Maximalen Anzahl der Plätze. Somit kann niemand Platz 30 eingeben wenn es nur 20 gibt.
Dann hatte ich übeleget über ein SELECT zu schauen welche Plätze aktuell belegt sind. Das kann ich ja ausgeben über for row, aber ich muss das ja dann in eine Variable packen oder? Die row´s sind ja Vertikal und die Variable müsste ja Horizontal sein. Da habe ich noch nix zu gefunden wie ich das "drehe"
Ok hier erklärst du das ich das auf Listen Element umsetzten kann.__blackjack__ hat geschrieben: ↑Donnerstag 21. März 2019, 10:30
Bei den Rückgaben von den Funktionen kannst Du Listen mit den Datenbankergebnissen zurück geben, oder Du fängst an hier zwischen der Datenhaltung und Objekten im Programm zu trennen und die Ergebnisse ”umzupacken”, beispielsweise in `collections.namedtuple` oder Klassen, damit das alles mehr nach Python aussieht und man nicht die Wörterbücher mit den unpytonischen Schlüsselnamen von der Datenbank hat. Alternativ könnte man die Spaltennamen in der Datenbank an die Python-Konventionen anpassen und die Ergebnisse in `addict.Dict`-Objekte verpacken. Oder sich mit dem SQLAlchemy-ORM beschäftigen.
Aber was mache ich mit diesem colections.namedtuple? Für das addict.Dict fällt mir gerade noch der Verstand.