2010-06-18 127 views
2

我正在使用sqlalchemy的反射工具來獲取Table對象。我這樣做是因爲這些表是動態的,表/列可以更改。下面是我使用的代碼:清除sqlalchemy反射緩存

def getTableByReflection(self, tableName, metadata, engine): 

    return Table(tableName, metadata, autoload = True, autoload_with = engine) 

的問題是,當上面的代碼運行兩次似乎返回相同的結果,無論列是否發生了變化。我嘗試使用mysession.refresh(mytable)進行刷新,但由於表未附加到任何元數據而失敗 - 這很有道理,但爲什麼我會看到緩存的結果?

有什麼辦法告訴元數據/引擎/會話忘記這張表,讓我乾淨地加載它?

+0

不附加到任何元數據?那麼你作爲'metadata'參數的值傳遞了什麼? – nkrkv 2010-06-18 10:15:26

+0

我使用了我在其餘代碼中使用的相同元數據對象。錯誤是'類'sqlalchemy.schema.Table'沒有映射' - 我把它表示爲它是用元數據做的,但可能不是? – OrganicPanda 2010-06-18 10:49:24

+3

如果您傳入新創建的新元數據實例,該怎麼辦?那樣有用嗎? – codeape 2010-06-18 10:50:53

回答

5

傳遞一個新創建的,新鮮的元數據實例。

1

與感謝codeape的評論上面我可以通過改變語法來解決這個問題:

def getTableByReflection(self, tableName, metadata, engine): 

    return Table(tableName, MetaData(), autoload = True, autoload_with = engine) 

所以在新MetaData()實例每次路過。這可能會影響性能,但在我的應用程序的這部分中對我來說沒關係。

所有信貸codeape