SQLAlchemy:从两个列表中获取匹配元素的行

2024-09-30 20:35:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我是SQL和SQLAlchemy的新手。我已经搜索了SO和其他地方,并试图理解SQLAlchemy文档,但是没有找到一个满意的解决方案来解决我的问题。在


我有一个表colours,其中有colourfarbe列和以下行:

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

在python中,我有两个列表:

^{pr2}$

两个列表可以有一个或多个元素。在

使用SQLAlchemy,我如何获得在其内容中包含la其中一个的行(其中lalb中的元素数量未知)的所有行?因此,应搜索所有列。在

对于上面的示例,结果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

我目前的解决方案是(更新:5.5.2016):

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+'%')),怎么能做得更好呢?在


Tags: orsqlalchemysessionfilterquerylalikelb
1条回答
网友
1楼 · 发布于 2024-09-30 20:35:17

我相信我明白你想做什么。您将需要将该表连接到自身。所以你将加入到行的ID上(不管它们有什么共同点)

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

相关问题 更多 >