2016-01-06 65 views
1

Howdie做,SQLAlchemy的LEFT JOIN WHERE子句被轉換成零和一

我有以下SQL,我正在轉換爲SQLAlchemy的:

select t1.`order_id`, t1.`status_type` 
from `tracking_update` AS t1 LEFT JOIN `tracking_update` AS t2 
ON (t1.`order_id` = t2.`order_id` AND t1.`last_updated` < t2.`last_updated`) 
where t1.`order_id` = '21757'and t2.`last_updated` IS NULL 

的SQL只是返回的最新跟蹤更新訂單ID 21757.我正在通過左連接回到同一個表來完成此操作。爲了做到這一點,我首先走樣表:

 tUAlias1 = aliased(TrackingUpdate) 
     tUalias2 = aliased(TrackingUpdate) 

到目前爲止,這是我爲我轉換爲SQLAlchemy的:

tracking_updates = db.session.query(tUAlias1.order_id, tUAlias1.status_type).\ 
      outerjoin(tUalias2, (tUAlias1.order_id == tUalias2.order_id) & (tUAlias1.last_updated < tUalias2.last_updated)).\ 
      filter(and_(tUAlias1.order_id == '21757', tUalias2.last_updated is None)) 

這是SQLAlchemy的結果經由日誌在服務器上執行的代碼:

SELECT tracking_update_1.order_id AS tracking_update_1_order_id, tracking_update_1.status_type AS tracking_update_1_status_type 
FROM tracking_update AS tracking_update_1 LEFT OUTER JOIN tracking_update AS tracking_update_2 ON tracking_update_1.order_id = tracking_update_2.order_id AND tracking_update_1.last_updated < tracking_update_2.last_updated 
WHERE 0 = 1 

正如你可以看到,過濾器(WHERE子句)現在是0 = 1

現在,如果我刪除and_聲明,並嘗試兩個過濾器,像這樣:

tracking_updates = db.session.query(tUAlias1.order_id, tUAlias1.status_type).\ 
      outerjoin(tUalias2, (tUAlias1.order_id == tUalias2.order_id) & (tUAlias1.last_updated < tUalias2.last_updated)).\ 
      filter(tUAlias1.order_id == '21757').filter(tUalias2.last_updated is None) 

我收到了同樣的結果。我知道SQL本身很好,因爲我可以通過MySQL工作臺來運行它。

當SQL直接運行,我會收到以下

order ID | Status 
21757  D 

另外,如果我刪除tUalias2.last_updated是無,我居然收到了一定的效果,但它們都是不正確的。這是SQL日誌中:

Python代碼

tracking_updates = db.session.query(tUAlias1.order_id, tUAlias1.status_type).\ 
      outerjoin(tUalias2, (tUAlias1.order_id == tUalias2.order_id) & (tUAlias1.last_updated < tUalias2.last_updated)).\ 
      filter(tUAlias1.order_id == '21757') 

SQLAlchemy的運行:

SELECT tracking_update_1.order_id AS tracking_update_1_order_id, tracking_update_1.status_type AS tracking_update_1_status_type 
FROM tracking_update AS tracking_update_1 LEFT OUTER JOIN tracking_update AS tracking_update_2 ON tracking_update_1.order_id = tracking_update_2.order_id AND tracking_update_1.last_updated < tracking_update_2.last_updated 
WHERE tracking_update_1.order_id = '21757' 

任何想法?

回答

0

Howdie做,

我想通了

Python的 '是' 我發現了這一點要歸功於以下S/O問題運營商沒有發揮好與SQLAlchemy的

Selecting Null values SQLAlchemy

因爲我已經更新了我的查詢到以下幾點:

tracking_updates = db.session.query(tUAlias1.order_id, tUAlias1.status_type).\ 
      outerjoin(tUalias2, (tUAlias1.order_id == tUalias2.order_id) & (tUAlias1.last_updated < tUalias2.last_updated)).\ 
      filter(tUAlias1.order_id == '21757').filter(tUalias2.last_updated == None)