2012-11-21 62 views
4

假設我有一個映射類User,映射到一個同名的表,併爲他的年齡列「年齡」。 我現在感興趣的是以下問題:在sqlalchemy中,如何通過使列條目相同來組合兩個查詢?

在我的應用程序的過程中,涌現出兩個查詢:

q1 = session.query(User).filter(lots of conditions) 
q2 = session.query(User).filter(lots of other conditions) 

我現在想在他們具備的條件「加入」到第二季度Q1同樣的年齡。 但我不知道這可能如何工作。我嘗試沒有成功如下:

q1.join(q2.subquery(), q1.age==q2.age) # the query doesn't hold the columns of the queried class 
q1.join(Age).join(q2.subquery()) # Works only if age is a relationship with mapped class Age 

我最親密的電話都是這樣的:

a1 = aliased(User) 
a2 = aliased(User) 
q1 = session.query(a1) 
q2 = session.query(a2) 
s = q2.subquery() 
q1.join(s, a1.age==a2.age).all() 
>>> sqlalchemy.exc.OperationalError: (OperationalError) no such column: user_2.age 'SELECT user_1.id AS user_1_id, user_1.name AS user_1_name, user_1.age AS user_1_age \nFROM user AS user_1 JOIN (SELECT user_2.id AS id, user_2.name AS name, user_2.age AS age \nFROM user AS user_2) AS anon_1 ON user_1.age = user_2.age'() 

如何使這個運行任何想法?

+0

它究竟抱怨什麼?對我來說,它看起來像ON子句想要引用user_2,它隱藏在子查詢中。它應該想要引用anon_1。這是sqlalchemy中的錯誤嗎? – Turion

回答

8

在擺弄和閱讀關於子查詢的問題的答案後,我設法找到了解決方案。相反,最後,犯罪行,放:

q1.join(s, a1.age==s.columns.age).all() 

這樣一來,就子句成爲ON user_1.age = anon_1.age,這是我們想要的。

+0

對於試圖編輯這篇文章的人,我不認爲'a1'應該是'q1',但我在5年內沒有使用過SQLAlchemy,所以我可能是錯的。請評論上述代碼的問題。 – Turion

相關問題