2011-09-15 15 views
0

私はsqlalchemy評価基準タプルのリストに基づいた評価基準?

は内の既存のメカニズムがある...私はpostfixの表記を使用して
['|',('name','=','root'), ('role','=','admin')]以下のような制約のための規則を指定するためのタプルのリストを使用することを計画していますそのため、メカニズムのいくつかのアクセスルールのタイプを適用したいです私は

or_(User.name='root', User.role='admin')

+0

ありませんが、しかし、あなたは1を構築することができます。最近の関連する質問については、http://stackoverflow.com/questions/7411812/how-to-create-literal-based-query-in-sqlalchemyも参照してください。 – van

答えて

2

ようSQLAlchemyのクエリのlangに、そのようなドメインを変換するのを助けることができるのpythonは、ここに1つのスタートだ:

私はあなたのEXPRESを書き換えるつもりです接頭辞表記法の観点からは、あなたはおそらく他の場所での演算子を処理するためにいくつかのより具体的な作業のチェックを追加することができ、

test_expression = ['|',('=','name','root'), ('=','role','admin')] 

をしかし:オペレータは最初であり、他の値は、次のようにします。

def buildquery(context, expression): 
    OPERATORS[expression[0]](context, expression[1:]) 

def build_or(context, args): 
    return sqlalchemy.or_(*(buildquery(context, arg) for arg in args)) 

def build_eq(context, args): 
    colname, value = args 
    return getattr(context, colname) == value 

OPERATORS = { 
    '|': build_or, 
    '=': build_eq} 

そして、それを使用するあなたがしてクエリを使用するマップされたクラスパスする:

session.query(User).filter(build_query(User, test_expression)) 
関連する問題