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