0

我想从 mysql 数据库中获取一行,然后修改一些字段并提交。在我提交之前,应该禁止更新这一行。所以我使用with_lockmode('update')。我使用以下 RoutingSession,我发现它使用Slave来执行此查询。但我想用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

我假设你从我在 SQLAlchemy 中的 Django-style Database Routers 的博客文章中获得了这个秘诀。如果您查看“手动访问”部分,您将看到当您需要将路由会话显式指向某个节点时的配方:

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 回答