@
Sirius3: In einem anderen Thread habe ich meine Anmelde-Funktion bereits veröffentlicht, aber ich tue dies hier nochmal.
Code: Alles auswählen
def connect_to_mysql(dbm_system, dbm_driver, db_user, db_passwd, db_host, db_port, db_name):
try:
engine = create_engine('{db_sys}+{db_driver}://{user}:{password}@{host}:{port}/{db}'.format(
db_sys=dbm_system,
db_driver=dbm_driver,
user=db_user,
password=db_passwd,
host=db_host,
port=db_port,
db=db_name,
connect_args = {'time_zone': '+00:00'},
encoding='utf8',
echo=True))
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
connection = engine.connect()
connection.close()
return True
Ich habe meine Funktion etwas erweitert. Zwei neue Argumente sind hinzugekommen. Der Funktion wird dann einmal das Datenbanksystem (MySQl, PostgreSQL, MS SQL etc.) und dann einmal den dazugehörigen Treiber (pymssql, pymysql etc.) übergeben. Ich habe mich entschieden nicht auf ODBC zu fahren. Meine Entscheidung beruht darauf, weil es vom ODBC Treiber vom MySQL gleich drei Versionen gibt und ich nicht erraten möchte welchen davon der Anwender auf seinem Rechner hat, und weil ich dem Anwender nicht noch zusätzlich Arbeit aufhalsen möchte, dass er sich gefälligst einen ODBC-Treiber installieren soll, und das auch nur diesen, den ich will. Und überhaupt sähe dann der Code für die ODBC-Anwendung (für mich) sehr hässlich aus:
Code: Alles auswählen
cndBase = pyodbc.connect("DRIVER={MySQL ODBC 3.51 Driver}; SERVER="+db_host+"; PORT="+db_port+";DATABASE="+db_name+"; UID="+db_user+"; PASSWORD="+db_port+";")
In der Geschweiften Klammer, in welcher der Treiber (Driver) mit angegeben werden muss ist wirklich hässlich, und man müsste sich hier auf eine Version einigen. Und dann betrifft das nur MySQL. Ich verfahre also so, dass ich mich vom ODBC-Treiber fernhalte, und für jedes Datenbanksystem eine Treiber-Bibliothek lade. Daher habe ich die Funktion erweitert. Ich habe ein zentrales Wörterbuch angelegt, die dann von den Einstellungen aus einer INI-Datei befüllt wird. Darin wird dann auch bekannt gegeben, für welches Datenbanksystem der Anwender entschieden hat. Und daraus wird dann die entsprechende DBAPI-Bibliothek geladen. Es ist vielleicht nicht der Königsweg, aber so erspare ich mir diese Version-Angaben und dieses Version-WirrWarr, und dem Anwender bleibt ein weiterer Installations-Schritt erspart.
Aber zum Thema Wörterbuch. Wieso erzeugt man kein leeres Wörterbuch, um es dann hinterher zu befüllen? Aber ich lese aus deiner Anmerkung heraus, dass ich die Session nicht in einem Wörterbuch schreiben brauche, da SQLAlchemy sie für sich speichert, richtig? Ich bin mir nur nicht sicher, ob SQLAlchemy die Session "lange" behält? Wie gesagt, ich stelle es mir immer vor, dass man sich erst einmal anmeldet, und sagen wir mal 3 Stunden nichts macht, und später Daten manipulieren will, und das Programm natürlich offen bleibt. Oder ob SQLAlcemy sie später für "ungültig" erklärt?
Ach, und der Wert
True, der bei Erfolg zurückgegeben wird, ist in sofern wichtig, dass beim Erfolg das Anmeldefenster geschlossen wird. Im View-Modul wird also darauf geprüft, ob die Funktion True zurück liefert, wenn nicht, dann wird die Fehlermeldung in Form eines QMessageBox ausgegeben.
@snafu: Deine Anmerkung mit den Try-Blöcken klingt sehr plausibel und logisch. Danke. Ich muss mir mal deine Anmerkung durch den Kopf gehen lassen, und versuche mal das Ganze in einem Quelltext zu schreiben, denn momentan habe ich keine Ahnung wie das alles aussehen sollte.