给定一个SQLAlchemy映射类Table
和该类的实例t
,如何获取t.colname
对应于该sqlalchemy.org.attributes.InstrumentedAttribute
实例的值Table.colname
?
如果我需要用一个Column
而不是一个问同一个问题InstrumentedAttribute
怎么办?
给定一个ORDER BY
子句和一行中的列列表,我想找到给定排序中该行之前或之后的前n行.
要获取与其对应的对象属性值InstrumentedAttribute
应该足以从它ColumnProperty
获取属性的键并从对象获取它:
t.colname == getattr(t, Table.colname.property.key)
Run Code Online (Sandbox Code Playgroud)
如果你有一个Column
它可以变得有点复杂,因为对应的属性Column
可能有一个不同的键.目前似乎没有公共API从列到映射器上的相应属性.但是如果你不需要覆盖所有情况,只需使用attr获取attr Column.key
.
为了支持降序排序,您需要构建desc()
函数内部或者在非公共API中进行一些操作.降序修饰符的类ClauseElement
是sqlalchemy.sql.expression._UnaryExpression
.要查看它是否正在下降,您需要检查该.modifier
属性是否为sqlalchemy.sql.operators.desc_op
.如果是这种情况,您可以通过.element
属性获取其中的列.但是你可以看到它是一个私有类,所以在升级版本时要注意该区域的任何变化.
检查降序仍然不能涵盖所有情况.对任意排序的完全一般支持需要能够重写完整的SQL表达式树,用对象中的相应值替换对表的引用.不幸的是,目前公共API不可能实现这一点.遍历和重写部分很容易sqlalchemy.sql.visitors.ReplacingCloningVisitor
,复杂的部分是确定哪个列映射到哪个属性给定继承层次结构,映射到连接,别名以及可能还有一些让我现在逃避的部分.我将尝试实现这个访问者,也许我可以提出足够强大的东西,值得集成到SQLAlchemy中.