2016-04-30 5 views
0

私はSQLとSQLAlchemyを初めて使用しています。私はすでにSOや他の場所を検索してSQLAlchemyのドキュメントを理解しようとしましたが、私の問題に対する満足のいく解決策は見つかりませんでした。SQLAlchemy:2つのリストの要素に一致する行を取得


私は列colourfarbeと、次の行を持つ表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ので

、どのように私は(lalbのいずれかの要素数は不明である)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+'%'))なしではどうすればより良い結果が得られますか?

答えて

0

私はあなたがしようとしていることを信じています。あなたは自分自身にテーブルを参加させる必要があります。だから、(彼らが共通して持っているものは何でも)行のIDの答えのための

select * from colours c1, colours c2 where c1.colour = "*la*" 
join c2 where c2.ID=c1.ID and c2.colour= "*lb*" 
+0

おかげで参加しますが、私はSQLAlchemyの中でそれを持っている必要があり、それはLA、LB、LC(拡張可能でなければなりません... l#)。 – topic2k

関連する問題