如何交换sqlalchemy元数据的postgres模式属性

时间:2014-09-19 10:56:46

标签: python postgresql sqlalchemy

我们正在将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模块都使用正确的模式?

1 个答案:

答案 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