2014-01-18 36 views
0

我有一個SQLAlchemy的表達等同於以下查詢:如何修改SQLAlchemy表達式的連接子句?

SELECT * 
FROM T1 
WHERE (...) 

我想修改的表達,這樣就相當於這個查詢:

SELECT * 
FROM T1 JOIN T2 ON T1.id=T2.id 
WHERE (...) 

編輯:爲了澄清,我詢問如何修改一個已經存在的表達式對象,而不是如何創建一個新的表達式對象。

回答

0
# ORM version: T1 and T2 are mapped classes 
q_old = session.query(T1, T2).filter(T1.id == T2.id).filter("mycondition") 
print q_old 
q_new = session.query(T1, T2).join(T2, T1.id == T2.id).filter("mycondition") 
print q_new 

# Core version: T1 and T2 are Table(...) 
s_old = select("*").select_from(T1).where("mycondition") 
print s_old 
s_new = select("*").select_from(T1.join(T2, T1.c.id==T2.c.id)).where("mycondition") 
print s_new 

我會建議不要使用SELECT *,但並建議使用select([T1, T2])代替。

更新:爲了從s_old去s_new你可以嘗試以下方法:

assert len(s_old._from_obj) == 1 
T1inferred = s_old._from_obj[0] 
s_upd = s_old.select_from(T1inferred.join(T2, T1inferred.c.id==T2.c.id)) 
print s_upd 

基本上你嘗試從給定的s_old所以T1,你可以構建一個聯接,而where條件將被保留。 請注意,SELECT *現在將返回T1T2的列。

+0

嗨範謝謝你的回答,但請看我的說明 - 我需要修改一個已經存在的表達式。就您的解決方案而言,我已經擁有s_old,並且我無法訪問'mycondition',因此我無法從頭開始重新構建表達式。 – jl6

+0

我明白了,請參閱答案的**更新**部分。 – van