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

时间:2009-11-10 17:55:32

标签: python sqlalchemy

给定SQLAlchemy映射的类Table以及该类t的实例,如何获取与t.colname实例对应的sqlalchemy.org.attributes.InstrumentedAttribute的值Table.colname

如果我需要使用Column而不是InstrumentedAttribute提出同样的问题该怎么办?

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

1 个答案:

答案 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中。