SQLAlchemy:覆盖查询中关系定义的“order_by”

2024-06-09

所以,我有一个类似的模型:

class Foo(model):
    __tablename__ = "foo"
    id = Column(Integer, primary_key=True)
    data = relationship(
        "FooData",
        cascade="all, delete-orphan",
        backref="foo",
        lazy="dynamic",
        order_by="desc(FooData.timestamp)"
    )

    @property
    def first_item(self):
        # the problem is here:
        return self.data.order_by(asc("timestamp")).first()

    @property
    def latest_item(self):
        return self.data.first()


class FooData(Model):
    __tablename__ = "foo_data"
    foo_id = Column(Integer, ForeignKey("foo.id"), primary_key=True)
    timestamp = Column(DateTime, primary_key=True)
    actual_data = Column(Float, nullable=False)

所以,问题在于first_item那里的方法:当它按照上面的方式定义时,SQL看起来像这样:

SELECT foo_data.timestamp AS foo_data_timestamp, foo_data.actual_data AS foo_data_actual_data, foo_data.foo_id AS foo_data_foo_id 
FROM foo_data 
WHERE :param_1 = foo_data.foo_id ORDER BY foo_data.timestamp DESC, foo_data.timestamp ASC
--                                                                 ^^^^^^^^^^^^^^^^^^^^^^

显然,order_by查询中指定的内容将附加到关系定义中指定的内容,而不是替换它;有没有办法让查询覆盖原来的order_by?我知道我可以直接在FooData类,但如果可能的话我想避免这种情况。


根据文档 http://docs.sqlalchemy.org/en/rel_1_0/orm/query.html#sqlalchemy.orm.query.Query.order_by:

所有现有的 ORDER BY 设置可以通过传递来抑制None- 这也将抑制映射器上配置的任何 ORDER BY。

所以简单的解决办法就是重置ORDER BY条款,然后应用您需要的条款。喜欢:

self.data.order_by(None).order_by(asc("timestamp")).first()

如果您不想全部重置ORDER BY子句,但只想覆盖一列顺序,据我所知没有内置的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQLAlchemy:覆盖查询中关系定义的“order_by” 的相关文章

随机推荐