2009-11-10 23 views

回答

6

爲了得到一個對象的屬性對應一個InstrumentedAttribute值應該是不夠的,只是獲得屬性的關鍵,從它的ColumnProperty和從對象獲取它:

t.colname == getattr(t, Table.colname.property.key) 

如果你有Column它可以有點複雜,因爲對應於Column的屬性可能有不同的密鑰。目前似乎沒有一個公共API可以從一列到一個映射器上的相應屬性。但是,如果您不需要覆蓋所有情況,只需使用Column.key即可獲取attr。

爲了支持降序排列,您需要在函數內部構造desc(),或者在非公共API處戳一下。下降修飾符ClauseElement的類別是sqlalchemy.sql.expression._UnaryExpression。要查看它是否下降,您需要檢查.modifier屬性是否爲sqlalchemy.sql.operators.desc_op。如果出現這種情況,您可以通過.element屬性在列中找到它。但正如你所看到的,它是一個私人課程,所以在升級版本時要留意該區域的任何變化。

檢查降序仍然沒有涵蓋所有情況。對任意排序的完全一般支持需要能夠使用對象中的相應值來重寫完整的SQL表達式樹,以替換對錶的引用。不幸的是,目前這不適用於公共API。遍歷和重寫部分很容易,sqlalchemy.sql.visitors.ReplacingCloningVisitor,複雜的部分是弄清楚哪個列映射到哪個屬性給定的繼承層次結構,映射到連接,別名和可能更多的部分,現在逃脫我。我會試着實現這個訪問者,也許我可以想出一些足夠強大的值得融入SQLAlchemy的東西。

+0

這是否發生?給定一個'Column'和一個類或實例,我想發現它所關聯的'InstrumentedAttribute'。 – 2017-11-10 05:13:59