1

各ユーザーが独自のデータベースを持つようにアプリを構築しています (簡単に分離し、シャーディングの必要性を最小限に抑えるため)。これは、各 Web リクエストとすべてのバックグラウンド スクリプトが、リクエストを行っているユーザーに基づいて異なるデータベースに接続し、その接続をすべての関数呼び出しに使用する必要があることを意味します。

変数にアタッチすることで、Web リクエストに適切な接続を渡すミドルウェアを作成できると思いますが、リクエストによってrequest呼び出されるすべての関数とモデル メソッドがこの接続を使用するようにする方法がわかりません。

4

1 に答える 1

1

「リクエストによって呼び出されたすべての関数とモデルメソッドがこの接続を使用するようにする」方法は簡単です。そのようなことのためにグローバル変数に依存していない適切に設計されたコードと同様に、接続を 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 に違反することになります。そのレベルでの重複は、準備が必要な重荷になります。

于 2013-09-22T02:39:13.623 に答える