2016-04-30 93 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

相关问题