我是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+'%')
),怎么能做得更好?
答案 0 :(得分:0)
我相信我看到你正在尝试做什么。您需要将表连接到自身。所以你将加入行的ID(无论它们有什么共同点)
selfref_list = [1, 2, 3]
selfref_list.append(selfref_list)