我假定「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)
到目前爲止你有什麼代碼? – zvisofer
我仍然堅持生成一個過濾器說'{「字段」:「比率」,「op」:「eq」,「數據」:「6」}' –
我試過這BinaryExpression(Currencies.Code,'abc ',operator.eq),但它給出了錯誤 –