2014-01-16 209 views
0

我有一個整數列表示該行的type表。這些整數範圍從1到5.如何在SQLAlchemy中指定自定義排序順序,例如,如果我想要按以下順序排序的行:[4, 2, 3, 5, 1]SQLALchemy自定義整數排序順序

我知道Enum數據類型,但映射到數據庫後端的VARCHAR並且不能更改模式。

回答

4

這是我的猜測,你必須已經有一些表,其中包含一些關於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) 
+0

這一個有趣的方法,雖然我不反對創建一個包含排序順序的表,但對我來說看起來有點矯枉過正。我個人不會在SQL中這樣做。數據庫爲您提供了一些整潔的[語法](http://stackoverflow.com/a/4088921/463782),如'ORDER BY idx(array [4,2,3,5,1],s.type)'。案例一與我的想法非常接近,但我會密切關注其表現。 – CadentOrange

+1

經過一些測試,'case'表達效果很好,我沒有注意到任何性能下降。感謝你的回答。 – CadentOrange