如何获取与SQLAlchemy InstrumentedAttribute对应的属性的值?

joe*_*ker 4 python sqlalchemy

给定一个SQLAlchemy映射类Table和该类的实例t,如何获取t.colname对应于该sqlalchemy.org.attributes.InstrumentedAttribute实例的值Table.colname

如果我需要用一个Column而不是一个问同一个问题InstrumentedAttribute怎么办?

给定一个ORDER BY子句和一行中的列列表,我想找到给定排序中该行之前或之后的前n行.

Ant*_*sma 6

要获取与其对应的对象属性值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中进行一些操作.降序修饰符的类ClauseElementsqlalchemy.sql.expression._UnaryExpression.要查看它是否正在下降,您需要检查该.modifier属性是否为sqlalchemy.sql.operators.desc_op.如果是这种情况,您可以通过.element属性获取其中的列.但是你可以看到它是一个私有类,所以在升级版本时要注意该区域的任何变化.

检查降序仍然不能涵盖所有情况.对任意排序的完全一般支持需要能够重写完整的SQL表达式树,用对象中的相应值替换对表的引用.不幸的是,目前公共API不可能实现这一点.遍历和重写部分很容易sqlalchemy.sql.visitors.ReplacingCloningVisitor,复杂的部分是确定哪个列映射到哪个属性给定继承层次结构,映射到连接,别名以及可能还有一些让我现在逃避的部分.我将尝试实现这个访问者,也许我可以提出足够强大的东西,值得集成到SQLAlchemy中.