2014-04-30 47 views
2

我有來自外部postgresql數據庫的ID列表。如何通過列表在sqlalchemy中訂購數據

A = [1,2,3,4,5,6,7,98,0] 

我會做查詢使用SQLAlchemy的數據庫,但我會被名單PostgreSQL裏的數據進行排序。

我已經閱讀了很多文檔,但找不到任何建議如何做到這一點。

所以,最終我將有:

results = session.query(user).limit(20).offset(10).order_by(A) 

乾杯

UPDATE:

我找到的解決方案,它是如我所料不那麼好,但效果很好。無論如何,如果你知道更好的解決方案,只需告訴我!

ids = ','.join([str(i) for i in A]) 
results = session.query(user).filter(user.id.in_(A)).\ 
limit(20).offset(10).\ 
order_by(" position(CONCAT(',',users.id::text,',') in ',{0},'.format(ids)") 
+0

BTW。我知道postgresql支持「連接值」http://stackoverflow.com/questions/866465/sql-order-by-the-in-value-list,但無法弄清楚如何實現這與sqlalchemy – Estatic

+0

我很好奇這種排序的原因,你會介意更多的闡述嗎? – van

回答

0

另一種方法是創建一個包含每個user.id順序位置的另一種輔助表,加入它,順序爲:

A = [1,2,3,4,5,6,7,98,0] 
stmt = " UNION ALL ".join('SELECT {0} AS user_id, {1} AS order_id'.format(uid, row) 
     for row, uid in enumerate(A)) 
ordq = text(stmt).columns(user_id=Integer, order_id=Integer).alias("t") 
results = session.query(user).join(ordq, user.id == ordq.c.user_id).order_by(ordq.c.order_id).all() 

我無法判斷這是否是好於您的版本,但它至少應該是非RDBMS特定的。

+0

嗯,我的確在想這種方式,但可能它應該非常慢,因爲您必須在數據庫中再做一次操作,而再多一次連接而不是一次查詢。 – Estatic

+0

不需要在數據庫中進行操作,因爲您在內存中執行此操作(如代碼所示)。會不會很慢 - 非常依賴於這個選擇語句的長度。 – van

+0

明白了,謝謝! – Estatic

1

如果您不一定需要在SQL中執行此操作,則可以直接在python中對返回的對象列表進行排序。

(使用python的sorted功能)

results = session.query(user).filter(user.id.in_(A)).all() 
results = sorted(results, key=lambda o: A.index(o.id)) 
-1

你可以試試:

results = session.query(user).limit(20).offset(10).order_by(*A)