Это может быть сложно, так как у вас уже есть все сопоставленное с точки зрения различных связей. Аргумент «schema» для Table - это способ отображения синтаксиса «schemaname.tablename», однако это будет означать, что вы будете использовать сопоставленные классы, отличные от обычных классов, сопоставленных с таблицей без имени схемы. 1001 *
Итак, сначала несколько платформо-зависимых методов, которые облегчили бы это. Если вы работаете в 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
. Если вам нужно, вы можете использовать более конкретный подход, который есть на этой вики-странице.