2016-08-08 10 views
1

私はこのモデルがあります:SQLAlchemyで動的比較を行うことはできますか?

class PUC(Base): 
    pucId = Column(Integer, primary_key=True) 
    asset = Column(TINYINT) 
    article = Column(TINYINT) 
    more values ... 
    more values ... 

をそして、私は(この方法では、私が試した)動的にクエリを実行する必要があります。

pucs = session.query(PUC).filter(PUC[unique_by_param] == 1).all() 

unique_by_paramの値は、フロントエンドから来ます。 unique_by_paramの例は次のとおりです。{str}'asset'{str}'article'{str}'another_model_value'

私は本当に行う方法です必要なもの。私が試した最初の方法のように、 session.query(PUC).filter(PUC.asset == 1)またはsession.query(PUC).filter(PUC.article == 1)

# this is a accounting table, so this have around 250 columns 
#and this special columns be around 70 variables... 
#So this isn't an option o do this. 
if unique_by_param == 'asset': 
    q = (PUC.asset == 1) 
elif unique_by_param == 'article': 
    q = (PUC.article) 
elif ...more values: 

pucs = session.query(PUC).filter(or_(*q)) 

使用して結果を(PUC[unique_by_param])があり、私が以前に使用している方法ですが、それを行うにはかなりの方法ではないですが、それを行うにはかなりの方法ではありませんTypeError: 'DeclarativeMeta' object is not subscriptable

ですここ

+0

'PUC.asset'は' TINYINT'はなく、 'bool'タイプであれば、あなたは' PUC.asseを期待していますt == True'を行うには? –

+0

はい、それはブールです。だから、もし私がこれをチェックすると、 'pucs'の値はまったく違う@ cricket_007 –

+0

いいえ、あなたの列は' BOOLEAN'という値ではなく 'TINYINT'です。 –

答えて

1

filter_bykeyword argument unpackingを使用したアプローチです:

keyword = {unique_by_param : 1} 
session.query(PUC).filter_by(**keyword).all() 
+0

で編集されています。はい、素晴らしいソリューションですが、**非常に危険です。私は動的ではあるが安全な方法を同時に必要とする。 –

+0

@AdrianSernaそれは悪いアドバイスだから、私はそれを削除するべきだと思っている。私は、第二の(更新された)答えがより安全だと信じています。 –

関連する問題