为了账号安全,请及时绑定邮箱和手机立即绑定

如何通过 SQLAlchemy 中的自定义函数进行排序

如何通过 SQLAlchemy 中的自定义函数进行排序

大话西游666 2021-09-11 18:31:33
所以我有一个 SQLALchemy 模型,如下所示from sqlalchemy import (create_engine, Column, BigInteger, String,                         DateTime)from sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy.ext.hybrid import hybrid_propertyBase = declarative_base()class Trades(Base):    __tablename__ = 'trades'    row_id = Column(BigInteger, primary_key=True, autoincrement=True)    order_id = Column(String)    time = Column(DateTime)    event_type = Column(String)    @hybrid_property    def event_type_to_integer(self):        return dict(received=0, open=1, done=2)[self.event_type]    @event_type_to_integer.expression    def event_type_to_integer(self):        pass我希望能够在timethen by 之前先订购查询event_type。按时间排序很容易,因为日期时间具有自然排序。然而通过排序event_type是有点棘手,因为event_type可以利用的价值received,open和done。我希望我的所有查询都按照event_type上述指定的顺序对查询进行排序。似乎我需要使用混合属性,这是我在上面开始做的,但是为了使该order_by功能正常工作,我似乎还需要编写    @event_type_to_integer.expression    def event_type_to_integer(self):        pass功能。这是我画一个空白的地方。有没有人有关于如何编写这个函数来完成上述操作的建议。我试过阅读文档和类似的 StackOverflow 帖子。还是有问题。以供参考。这是我试图开始工作的查询    sess = Session()    orders = (        sess        .query(Trades)        .order_by(Trades.time.asc(), Trades.event_type_to_integer.asc())        .all()        )    sess.close()它抛出一个KeyError: <sqlalchemy.orm.attributes.InstrumentedAttribute object at 0x7fcb11861048>
查看完整描述

1 回答

?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

您可以使用SQL 中的CASE表达式来实现您的查找:


from sqlalchemy import case


_event_type_lookup = dict(received=0, open=1, done=2)


class Trades(Base):

    ...

    @hybrid_property

    def event_type_to_integer(self):

        return _event_type_lookup[self.event_type]


    @event_type_to_integer.expression

    def event_type_to_integer(cls):

        return case(_event_type_lookup, value=cls.event_type)

这使用构造的value简写case()来生成一个表达式,该表达式将给定的列表达式与字典中传递的键进行比较,从而产生映射值作为结果。


查看完整回答
反对 回复 2021-09-11
  • 1 回答
  • 0 关注
  • 306 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信