我们正在将SQLAlchemy与postgres结合使用,我正在尝试切换我正在动态工作的postgres模式,以便每个后续的sql命令都考虑新的模式。我们正在使用声明性基本模型,我正在努力使表类在需要时切换它们的模式。
否则
sa_metadata.schema = 'new_schema'
for table in sa_metadata.tables.keys():
table.metadata = 'new_schema'
不能正常工作,因为一些postgres对象(序列,枚举)有自己的架构属性,我不想遍历表中的每个对象来更改架构。我看了Table.tometadata但未能正确使用。
有人知道这种东西是否可能?或者我有两个模式,每个模式都有相同的表格,这是多么愚蠢?
编辑:
所以基本上我需要重新创建元数据和与之关联的新表。问题是我的所有表定义都在另一个在导入时读取的python文件中。包含的内容:
SaBaseClass = declarative_base()
SaBaseClass.schema = settings.DB.schema
TableA(SaBaseClass):
__tablename__ = 'leg'
id = Column(Integer, primary_key=True)
col = Column(Enum('a', 'b', 'c', inherit_schema=True))
基于此,我怎样才能确保每当我想要更改整个元数据的模式时,导入TableA的每个其他python模块都使用正确的模式?
答案 0 :(得分:0)
在Enum上使用inherit_schema标志:
from sqlalchemy import Table, MetaData, Column, Integer, Enum
m1 = MetaData()
t1 = Table(
't1',
m1, Column('a', Integer),
Column('b', Enum('a', 'b', 'c', inherit_schema=True)), schema='x')
m2 = MetaData()
t2 = t1.tometadata(m2, schema='y')
print t2.schema
print t2.c.b.type.schema