0

mysql データベースから行を取得し、いくつかのフィールドを変更してコミットしたいと考えています。コミットする前に、この行の更新を禁止する必要があります。だから私はwith_lockmode('update')を使用します。次の RoutingSession を使用していますが、スレーブを使用してこのクエリを実行していることがわかります。しかし、 Masterを使用してこのクエリを実行したいのですが、 get_bindで何をすればよいでしょうか???

class RoutingSession(Session):
    def get_bind(self, mapper=None, clause=None):
        if self._flushing:

            return engines['master']
        else:
            return engines['slave']

row = session.query(SomeTable).filter(SomeTable.id = 1).with_lockmode('update').one
row.somefield = 'newcontent'
session.commit()
4

1 に答える 1

1

このレシピは、 Django-style Database Routers in SQLAlchemyでの私のブログ投稿から得たと思います。「手動アクセス」セクションを見ると、ルーティング セッションを特定のノードに明示的にポイントする必要がある場合のレシピが表示されます。

class RoutingSession(Session):

    def get_bind(self, mapper=None, clause=None ):
        if self._name:
            return engines[self._name]
        elif mapper and issubclass(mapper.class_, OtherBase):
            return engines['other']
        elif self._flushing:
            return engines['master']
        else:
            return engines[
                    random.choice(['slave1','slave2'])
                ]

    _name = None
    def using_bind(self, name):
        s = RoutingSession()
        vars(s).update(vars(self))
        s._name = name
        return s

次に、そのバインドを明示的に使用して操作を行います。

m1 = Session().using_bind("master").query(Model1).first()
于 2012-10-04T15:07:20.617 に答える