私はSQLとSQLAlchemyを初めて使用しています。私はすでにSOや他の場所を検索してSQLAlchemyのドキュメントを理解しようとしましたが、私の問題に対する満足のいく解決策は見つかりませんでした。SQLAlchemy:2つのリストの要素に一致する行を取得
私は列colour
とfarbe
と、次の行を持つ表colours
あります
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
と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
私の現在のソリューションは、(更新: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
これはどのようにして改善できますか?私の完全なスクリプトでは、私は6つの列を検索する必要があります。それらはほとんど同じ線(Colours.xxxx.like('%'+a+'%')
)なしではどうすればより良い結果が得られますか?
おかげで参加しますが、私はSQLAlchemyの中でそれを持っている必要があり、それはLA、LB、LC(拡張可能でなければなりません... l#)。 – topic2k