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