【问题标题】:How do I get the value of a property corresponding to a SQLAlchemy InstrumentedAttribute?如何获取与 SQLAlchemy InstrumentedAttribute 对应的属性的值?
【发布时间】:2009-11-11 07:32:16
【问题描述】:

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

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

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

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    要获取与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 中。

    【讨论】:

    • 发生这种情况了吗?给定一个 Column 和一个类或实例,我想发现它与之关联的 InstrumentedAttribute
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多