2010-07-31 77 views
7

我正在編寫一個小型的sqlalchemy shim,用一些輕量級的數據轉換(主要是更改字段名稱)從MySQL數據庫中導出數據。我當前的腳本工作正常,但需要我基本上描述我的模型兩次 - 一次在類聲明中,一次作爲迭代的字段名稱列表。聲明式類的SQLAlchemy反省

我想弄清楚如何使用自省來標識列訪問器的行對象上的屬性。下面的工作幾乎是完美的:

for attr, value in self.__class__.__dict__.iteritems(): 
    if isinstance(value, sqlalchemy.orm.attributes.InstrumentedAttribute): 
     self.__class__._columns.append(attr) 

,除了我的一對多關係訪問器也是sqlalchemy.orm.attributes.InstrumentedAttribute的情況下,我需要跳過這些。在檢查課程詞典的時候,有什麼辦法可以區分兩者嗎?

我在sqlalchemy introspection上找到的大多數文檔都涉及到metadata.table,但由於我正在重命名列,所以這些數據不是可以輕鬆映射的。

回答

1

我仍然希望看到這個問題的答案,但我已經通過名稱來解決它 - 修改關係訪問器(例如'_otherentity'而不是'otherentity'),然後過濾名稱。爲我的目的正常工作。

7

每個映射實體的映射器都具有包含所有列定義的屬性columns。舉例來說,如果你有一個聲明類User,您可以訪問User.__mapper__映射器和列有:

list(User.__mapper__.columns) 

每一列有幾個屬性,包括name(這可能不是同一個名爲key映射屬性),nullableunique等等...

+0

這似乎比檢查metadata.tables ['mytable']。columns更普遍有用,但它似乎不允許我發現描述符分配給我的實體類的類變量,所以我如何產生輸出映射類屬性名稱到它們的值的原始問題。 – 2010-08-01 16:11:08

1

InstrumentedAttribute實例都有一個名爲impl的屬性,它是在實踐中ScalarAttributeImpl,一個ScalarObjectAttributeImplCollectionAttributeImpl

我不知道這是多麼脆弱,但我只是檢查哪一個是確定一個實例是否最終會返回一個列表或單個對象。

相關問題