0
我有一個整數列表示該行的type
表。這些整數範圍從1到5.如何在SQLAlchemy中指定自定義排序順序,例如,如果我想要按以下順序排序的行:[4, 2, 3, 5, 1]
?SQLALchemy自定義整數排序順序
我知道Enum數據類型,但映射到數據庫後端的VARCHAR並且不能更改模式。
我有一個整數列表示該行的type
表。這些整數範圍從1到5.如何在SQLAlchemy中指定自定義排序順序,例如,如果我想要按以下順序排序的行:[4, 2, 3, 5, 1]
?SQLALchemy自定義整數排序順序
我知道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)
這一個有趣的方法,雖然我不反對創建一個包含排序順序的表,但對我來說看起來有點矯枉過正。我個人不會在SQL中這樣做。數據庫爲您提供了一些整潔的[語法](http://stackoverflow.com/a/4088921/463782),如'ORDER BY idx(array [4,2,3,5,1],s.type)'。案例一與我的想法非常接近,但我會密切關注其表現。 – CadentOrange
經過一些測試,'case'表達效果很好,我沒有注意到任何性能下降。感謝你的回答。 – CadentOrange