SQLAlchemy:获取与两个列表

时间:2016-04-30 17:57:51

标签: python python-2.7 sqlalchemy

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

我有一个表colours,其中包含colour列和farbe以及以下行:

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']

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

使用SQLAlchemy,我如何获得其中la 之一lb内容的所有行(la中的元素数量}和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

我目前的解决方案是(更新: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+'%')),怎么能做得更好?

1 个答案:

答案 0 :(得分:0)

我相信我看到你正在尝试做什么。您需要将表连接到自身。所以你将加入行的ID(无论它们有什么共同点)

selfref_list = [1, 2, 3]
selfref_list.append(selfref_list)