2013-04-24 45 views
2

搜索並嘗試不同的事情後,我似乎無法弄清楚我在這裏做錯了什麼。我打算髮生的事情是填充orderServicesFull,其中服務對象填充了由orderServices的serviceID過濾的數據庫數據。按列表屬性過濾SQLAlchemy屬性錯誤

我運行到是我似乎無法找到正確的語法甩開orderServices服務ID的每個實例(代碼第二行)的問題。

orderServices = DBSession.query(ServicesByOrder).filter(ServicesByOrder.orderID == request.GET['orderID']).all() 

orderServicesFull = DBSession.query(Services).filter(Services.serviceID == orderServices.serviceID).all() 

錯誤:

AttributeError: 'list' object has no attribute 'serviceID' 

我已經試過:

在我試圖解決這個我第一次做了一些打印瞭解正在通過什麼。我也看了一些文檔,試圖理解什麼是合適的。我甚至試過這個...大聲笑

print("<---DEBUG--->") 
    serviceIDs = [] 
    for i in range(0, len(orderServices)): 
     serviceIDs.append(orderServices[i].serviceID) 
     print(serviceIDs[i]) 

這背後的想法是,它是一個簡單的列表,我可以更容易地工作。我試圖使用它而不是orderServices列表。正如你所猜測的那樣,也沒有效果。

任何想法或建議將不勝感激。

感謝您的時間

!解決了!

後好了很多亂搞和一些研究,我想出了一個解決方案。它可能不如其他人想出來的那樣有效,但它起作用。

我的問題是從事實,我不知道該列表中瀰漫着的物體來。

orderServiceList = DBSession.execute(\ 
"SELECT s.serviceID, s.serviceName, s.serviceCost "+\ 
"FROM tblServicesByOrder AS so "+\ 
"INNER JOIN tblServices AS s "+\ 
"ON so.serviceID = s.serviceID "+\ 
"WHERE so.orderID = 1").fetchall() 

orderServicesFull = [row for row in orderServiceList] 

這樣做讓我創建一個我需要的數據字典表,然後從那裏充斥着我orderServicesFull。

我希望這可以幫助別人有同樣的問題或類似的。

回答

1

從你的第一個代碼片段中,orderServices變量實際上是一個列表。因此,您不能在第二個查詢中使用orderServices.ID(您得到的錯誤解釋了這一點)。
你應該能夠得到使用ORM查詢的所有服務與join

orderServicesFull = (DBSession.query(Services) 
    .join(ServicesByOrder, Services.serviceID == ServicesByOrder.serviceID) 
    .filter(ServicesByOrder.orderID == request.GET['orderID']) 
    ).all() 

如果你有ServicesServicesByOrder之間定義的(只有一個)關係,那麼連接不需要clause參數併成爲.join(ServicesByOrder)

+0

有趣的..沒有加入和過濾器被轉換爲SQL的這個序列?如果不是這樣,我不會在任何東西上做這個,但只有小桌子。最好在數據庫級別進行連接和過濾。 – Tagar 2015-06-28 15:54:51

+0

是的,它被轉換爲SQL – van 2015-06-28 18:15:49