代码之家  ›  专栏  ›  技术社区  ›  joeforker

如何获取与sqlAlchemy instructedAttribute对应的属性值?

  •  4
  • joeforker  · 技术社区  · 15 年前

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

    如果我需要用 Column 而不是 InstrumentedAttribute ?

    给出了 ORDER BY 子句和一行,我希望在给定的顺序中找到该行之前或之后的前n行。

    1 回复  |  直到 15 年前
        1
  •  6
  •   Ants Aasma    15 年前

    获取与 InstrumentedAttribute 只需从属性的 ColumnProperty 从对象中获取:

    t.colname == getattr(t, Table.colname.property.key)
    

    如果你有 Column 它可能会变得更加复杂,因为与 可能有不同的钥匙。当前似乎没有公共API来从映射器上的列获取相应的属性。但是如果你不需要覆盖所有的情况,只需使用 Column.key .

    要支持降序排序,您要么需要构造 desc() 在函数内部或在非公共API中插入一点。降序修饰符的类 ClauseElement sqlalchemy.sql.expression._UnaryExpression . 要查看它是否正在下降,您需要检查 .modifier 属性是 sqlalchemy.sql.operators.desc_op . 如果那样的话,你可以通过 .element 属性。但正如您所看到的,它是一个私有类,所以在升级版本时要注意该区域中的任何更改。

    检查下降仍然没有覆盖所有的情况。对任意排序的完全通用支持需要能够重写完整的SQL表达式树,用对象的相应值替换对表的引用。不幸的是,目前公共API不可能做到这一点。遍历和重写部分很容易 sqlalchemy.sql.visitors.ReplacingCloningVisitor ,复杂的部分正在确定哪个列映射到哪个属性,给定了继承层次结构、到联接的映射、别名,可能还有更多的部分暂时脱离了我。我将尝试实现这个访问者,也许我可以想出一个足够强大的东西来集成到sqlalchemy中。