2014-09-19 49 views
0

我們將SQLAlchemy與postgres結合使用,我試圖切換我正在動態處理的postgres模式,以便每個後續的sql命令都考慮到新的模式。我們正在使用一個聲明式基本模型,並且我正在努力使表類在需要時切換它們的模式。如何交換sqlalchemy元數據的postgres模式屬性

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

使用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 
+0

那我做了什麼,但是當我對ORM一部分工作,我無法理解了它... – cp2587 2014-09-19 14:23:15

+0

有沒有現在的簡單方法將所有類重新映射到不同的模式。這可以更好地處理在使用數據庫時發生的上下文,這是由即將發佈的功能解決的。目前,您最好的辦法是不要使用架構,在使用模型時,請設置[搜索路徑](http://www.postgresql.org/docs/9.1/static/ddl-schemas.html#DDL- SCHEMAS-PATH)在您使用的引擎或與會話一起使用的連接上。 – zzzeek 2014-09-19 18:26:38

相關問題