给定SQLAlchemy映射的类Table
以及该类t
的实例,如何获取与t.colname
实例对应的sqlalchemy.org.attributes.InstrumentedAttribute
的值Table.colname
?
如果我需要使用Column
而不是InstrumentedAttribute
提出同样的问题该怎么办?
给定ORDER BY
子句和行中的列列表,我想找到给定排序中该行之前或之后的前n行。
答案 0 :(得分: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中。