这可能很困难,因为您已经根据不同的绑定映射了所有内容。 Table 的“schema”参数是“schemaname.tablename”语法的呈现方式,但这意味着您将使用与映射到没有模式名称的表的普通类不同的映射类。
因此,首先需要一些特定于平台的技术,这会使这变得更容易。如果您使用的是 Oracle,请使用 Oracle CREATE SYNONYM 将“somedb.sometable”映射到远程模式中的“sometable”。如果您使用的是 Postgresql,请操作 search_path,以便在多个模式中搜索给定名称(请参阅 http://www.postgresql.org/docs/8.1/static/ddl-schemas.html#DDL-SCHEMAS-PATH)。
这些都不起作用?好的,那么你需要按照http://www.sqlalchemy.org/trac/wiki/UsageRecipes/EntityName 的配方做一些事情(对不起,这不是使用 Elixir,我不确定 Elixir 的功能是什么)。根据具体情况,有不同的方法来实现它。这是一种将新的匿名类映射到原始表的方法:
# regular class
class ClassOne(Base):
__tablename__ = 'one'
id = Column(Integer, primary_key=True)
class ClassTwo(Base):
__tablename__ = 'two'
id = Column(Integer, primary_key=True)
def map_to_alt_tb(cls, metadata, schemaname):
m = class_mapper(cls)
cls2 = type(
"AltClass",
(object, ),
{}
)
table = m.local_table.tometadata(metadata, schemaname)
mapper(cls2, table)
return cls2
alt_cls = map_to_alt_db(ClassTwo, somemetadata, "alt_schema")
map_to_alt_db() 将拉出ClassTwo 映射到的表,将其架构更改为“alt_schema”,然后将其映射到新类。
不过,这种方法失去了 ClassTwo 的其他任何特殊之处。如果您需要,您可以使用该 wiki 页面上的更多特定方法。