「リクエストによって呼び出されたすべての関数とモデルメソッドがこの接続を使用するようにする」方法は簡単です。そのようなことのためにグローバル変数に依存していない適切に設計されたコードと同様に、接続を API に渡します。したがって、リクエストごとにデータベース セッション オブジェクトをロードし、それを渡します。各マネージド オブジェクトはそれを所有しているセッションを認識しており、そこからクエリを実行できるため、モデル オブジェクトがそのセッション オブジェクトを明示的に渡すことなくさらにタートルするのは非常に簡単です。
db = request.db
user = db.query(User).get(1)
user.add_group('foo')
class User(Base):
def add_group(self, name):
db = sqlalchemy.orm.object_session(self)
group = Group(name=name)
db.add(group)
その正確なパターンを使用することはお勧めしませんが、セッションをどこでも明示的に渡す必要がないように、管理対象オブジェクトからセッションを取得する方法の例として役立ちます。
マルチテナンシーを処理する方法という最初の質問に...データモデルで!その低いレベルで物事を分割するシステムを設計することは、メンテナンスの負担が大きく、うまくスケーリングできません。たとえば、任意の数の独立した接続がある場合、任意のタイプの接続プールを使用することは非常に困難になります。これを回避するために、人々は通常、一部のデータベースでサポートされている SQL SCHEMA 機能を使用します。これにより、同じ接続を使用できますが、セッションごとに異なるテーブル構造にアクセスできます。それは良いことですが、これらのスキーマをすべて個別に管理すると、危険信号が発生し、データ モデル内のすべての重複で DRY に違反することになります。そのレベルでの重複は、準備が必要な重荷になります。