亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何通過 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 關注
  • 344 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號