0
我是新来的SQL和SQLAlchemy。我已经在SO和其他地方搜索过,试图理解SQLAlchemy文档,但没有找到令我满意的解决方案来解决我的问题。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']
两个列表可以有一个dozent或更多元素。
随着SQLAlchemy的,我怎么能得到哪些有la
和在它的内容(任la
和lb
元素的数量不详)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+'%')
),怎么能做得更好?
感谢您的回答,但我需要有它在SQLAlchemy的,它必须是可扩展的(LA,LB,LC ... L#)。 – topic2k