@MoonKid: Du hast seltsame Ansichten, was was "global" sein sollte. Jeder Import legt ein Deinem Namensraum Namen von fremden Modulen ab, das als Forderung zu haben, ist also nicht einhaltbar. Nur weil die Variable in einem Klassennamensraum steht, der keine wirkliche Klasse ist, ist sie dennoch global. Was ich damit sagen will, alles in ein MDatabase macht nichts besser, sondern nur umständlicher für Dich. Wenn Du kennzeichnen willst, dass etwas nicht zur öffentlichen API gehört, kann man es mit
einem Unterstrich kennzeichnen. Auf das Base-Beispiel angewendet: Auf Modulebene ein
ist die einzig richtige Vorgehensweise. Alle DB-Klassen erben dann von _Base.
Eine Klasse die wiederum SQLAlchemy kapselt scheint mir unnötig, weil SQLAlchemy ja schon eine Kapselung der Datenbankschnittstellen ist. Aber vielleicht kannst Du mich ja noch vom Gegenteil überzeugen.
Sessions sind nicht Thread-Safe, dass man für jeden Thread eine eigene Session braucht. Ich habe zum Beispiel für jede Transaktion eine eigene Session.