我有一个表,其中包含一列整数,表示行的type
。这些整数的范围为 1 - 5。如何在SQLAlchemy中指定自定义排序顺序,例如,如果我希望行按以下顺序排序[4, 2, 3, 5, 1]
?
我知道 Enum 数据类型,但它映射到数据库后端中的 VARCHAR,并且无法更改架构。
我猜你一定已经有一些表,其中包含有关type
或行的一些信息。如果你不这样做,也许你应该有这样一个查找表。如果此顺序始终相同,我将在此表中添加一列以指示排序,加入并使用它。
class TypeInfo(Base):
__tablename__ = 'typeinfo'
id = Column(Integer, primary_key=True)
sort_order = Column(Integer)
# assiming the database contains values like:
tis = [ TypeInfo(id=1, sort_order=50),
TypeInfo(id=2, sort_order=20),
TypeInfo(id=3, sort_order=30),
TypeInfo(id=4, sort_order=10),
TypeInfo(id=5, sort_order=40),
]
# your query might look like below:
q = session.query(SomeTable)
q = q.join(TypeInfo, SomeTable.type == TypeInfo.id).order_by(TypeInfo.sort_order)
如果无法更改数据库,或者顺序可能不同,则可以使用 case
表达式解决此问题,尽管它在大型数据集上可能不是快速执行:
_whens = {4: 1, 2: 2, 3: 3, 5: 4, 1: 5}
sort_order = case(value=SomeTable.type, whens=_whens)
q = session.query(SomeTable)
q = q.order_by(sort_order)