2016-04-30 167 views
0

我是新來的SQL和SQLAlchemy。我已經在SO和其他地方搜索過,試圖理解SQLAlchemy文檔,但沒有找到令我滿意的解決方案來解決我的問題。SQLAlchemy:獲取匹配來自兩個列表的元素的行


我有一個表colours的列colourfarbe及以下行:

red  rot 
green gruen 
yellow gelb 
blue blau 
black schwarz 
white weiss 
purple violett 
grey grau 
cyan tuerkis 

,並在Python我有兩個列表:

la = ['b', 'w'] 
lb = ['l', 'e'] 

兩個列表可以有一個dozent或更多元素。

隨着SQLAlchemy的,我怎麼能得到哪些有la在它的內容(任lalb元素的數量不詳)lb一個個都行?特此應該搜索所有列。

對於我上面的例子中生成的SQL查詢是這樣的:

SELECT * FROM colours WHERE 
(
    (colour LIKE "%b%" OR colour LIKE "%w%") AND 
    (colour LIKE "%l%" OR colour LIKE "%e%") 
) 
OR 
(
    (farbe LIKE "%b%" OR farbe LIKE "%w%") AND 
    (farbe LIKE "%l%" OR farbe LIKE "%e%"); 
) 

的結果應該是:

yellow gelb 
blue blau 
black schwarz 
white weiss 

我目前的解決方案是(更新:2016年5月5日):

query = session.query(Colours) 
session.query(Colours.colour, Colours.farbe) 
def GetFilter(color): 
    fltr = or_() 
    for c in color: 
     t = u'%{0}%'.format(c) 
     fltr = or_(fltr, 
        Colours.farbe.like(t), 
        Colours.colour.like(t) 
        ) 
    return fltr 
if la and lb: 
    fltra = GetFilter(la) 
    fltrb = GetFilter(lb) 
    query = session.query(Colours).filter(fltra).filter(fltrb) 
elif la: 
    fltra = GetFilter(la) 
    query = session.query(Colours).filter(fltra) 
elif lb: 
    fltrb = GetFilter(lb) 
    query = session.query(Colours).filter(fltrb) 
else: 
    query = session.query(Colours) 

for i in query.all(): 
    print i.id, i.colour, i.farbe 

這怎麼能做得更好?在我的完整腳本中,我有六列應該被搜索。如果沒有那些幾乎相同的行(Colours.xxxx.like('%'+a+'%')),怎麼能做得更好?

回答

0

我相信我看到你正在嘗試待辦事項。您需要將表加入自己。所以,你會參加該行的ID(無論他們的共同點)

select * from colours c1, colours c2 where c1.colour = "*la*" 
join c2 where c2.ID=c1.ID and c2.colour= "*lb*" 
+0

感謝您的回答,但我需要有它在SQLAlchemy的,它必須是可擴展的(LA,LB,LC ... L#)。 – topic2k

相關問題