Sqlalchemy 多模式中的一个实体:如何在运行时切换模式

Sqlalchemy 多模式中的一个实体:如何在运行时切换模式,sqlalchemy,Sqlalchemy,我使用具有多个模式的数据库(模式的数量是动态的,在启动时不知道)。每个模式存储相同的表定义 在文档中,我看到可以将模式选项设置为相应的模式名称。但是,当表存在于不同的模式中时,它如何工作呢?是否可以在运行时切换架构名称 更新29-11-2013 我发现了这一点,并编写了以下例程来切换正确的模式 engine = create_engine('db_host', echo=True) dbSession = scoped_session(sessionmaker(extension=ZopeTr

我使用具有多个模式的数据库(模式的数量是动态的,在启动时不知道)。每个模式存储相同的表定义

在文档中,我看到可以将模式选项设置为相应的模式名称。但是,当表存在于不同的模式中时,它如何工作呢?是否可以在运行时切换架构名称


更新29-11-2013 我发现了这一点,并编写了以下例程来切换正确的模式

engine = create_engine('db_host', echo=True)
dbSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
dbSession.configure(bind=engine)
metadata = MetaData(engine)
aTable = Table('aTable', metadata, 
                  Column('foo', String, primary_key=True),
                  Column('bar', String))

def map_class_to_some_table(cls, table, entity_name, **kw):
     newcls = type(entity_name, (cls, ), {})
     mapper(newcls, table, **kw)
     return newcls


class ObjectDefinition(object):
    def __init__(self):
        pass

class ObjectRepository():

    objectMapper = {}

    @classmethod
    def _getObjectMapper(cls, aSchema):
        if cls.objectMapper == None:
            cls.objectMapper = {}
        mapper = cls.objectMapper .get(aSchema)
        if mapper == None:
            logging.debug('Need to create a new mapper for schema %s'%aSchema)
            objectSchemaTable  = aTable.tometadata(metadata, schema=aSchema)
            mapper = map_class_to_some_table(ObjectDefinition, objectSchemaTable  , "object_%s"%aSchema)
            cls.objectMapper [aSchema] = mapper
        return mapper    

    @staticmethod
    def loadAllObject(schema):
        return dbSession.query(UserRepository._getUserMapper(schema)).all()

您可能会发现该示例很有用。我阅读了该示例,但不明白如何在运行时使用碎片切换模式名称。我可以切换不同的会话,但架构是在元数据中定义的,而不是在会话中定义的。经过一些额外的搜索,我找到了(请参阅我的更新)