2014-02-09 30 views
0

請考慮以下示例。根據用戶輸入動態生成sqlalchemy過濾器(本例中爲Jqgrid)

{"groupOp":"AND","rules":[{"field":"Rate","op":"eq","data":"6"}],"groups":[{"groupOp":"OR","rules":[{"field":"Code","op":"eq","data":"abc"},{"field":"Name","op":"eq","data":"fd"}],"groups":[]}]} 
  1. 分析,我需要遞歸生成每個條款
  2. 二元表達式然後結合使用「and_」或「or_」功能的結果。

但是我仍然停留在第一點。

任何關於如何實現它的指針?

+0

到目前爲止你有什麼代碼? – zvisofer

+0

我仍然堅持生成一個過濾器說'{「字段」:「比率」,「op」:「eq」,「數據」:「6」}' –

+0

我試過這BinaryExpression(Currencies.Code,'abc ',operator.eq),但它給出了錯誤 –

回答

2

我假定「AND - >(rules),(groups)」的含義意思是你想要AND(rule1,rule2,rule3 ... group1,group2,group3 ...)。我不知道該怎麼辦。

from sqlalchemy import * 
from sqlalchemy.orm import * 
from sqlalchemy.ext.declarative import declarative_base 

Base = declarative_base() 

class Thing(Base): 
    __tablename__ = 'thing' 
    id = Column(Integer, primary_key=True) 
    Rate = Column(Integer) 
    Code = Column(String) 
    Name = Column(String) 

rules = { 
    "groupOp": "AND", 
    "rules":[ 
     { 
      "field":"Rate", 
      "op":"eq", 
      "data":"6" 
     } 
    ], 
    "groups":[ 
     {"groupOp":"OR", 
     "rules":[ 
      {"field":"Code", "op":"eq", "data":"abc"}, 
      {"field":"Name","op":"eq","data":"fd"} 
     ], 
     "groups":[] 
    } 
]} 


from sqlalchemy import and_, or_ 
from operator import eq 
lookup = { 
    "AND": and_, 
    "OR": or_, 
    "eq": eq 
} 

def visit_rule(rules): 
    fn = lookup[rules['groupOp']] 
    return fn(
       *(
        [visit_expr(expr) for expr in rules['rules']] + 
        [visit_rule(subrule) for subrule in rules['groups']] 
       ) 
      ) 

def visit_expr(expr): 
    return lookup[expr["op"]](
       getattr(Thing, expr["field"]), 
       expr["data"] 
      ) 

# thing."Rate" = :Rate_1 AND (thing."Code" = :Code_1 OR thing."Name" = :Name_1) 
print visit_rule(rules) 
+0

感謝邁克爲美妙的圖書館。 –

相關問題