所以我有一个如下所示的SQLALchemy模型
from sqlalchemy import (create_engine, Column, BigInteger, String,
DateTime)
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.ext.hybrid import hybrid_property
Base = 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
我希望能够先通过time
然后通过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>
答案 0 :(得分:1)
您可以在SQL中使用CASE
expression来实现查找:
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()
速记来生成一个表达式,该表达式将给定的列表达式与字典中传递的键进行比较,从而产生映射值。