sqlalchemy根据元组列表评估标准,搜索?

时间:2011-09-15 04:49:06

标签: python search sqlalchemy eval

我想应用一些访问规则类型的机制,因为我计划使用元组列表来指定限制规则,如下所示
['|',('name','=','root'), ('role','=','admin')]使用后缀符号...

python中是否有任何现有的机制可以帮助我将这样的域转换为sqlalchemy查询lang,如

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

1 个答案:

答案 0 :(得分:2)

这是一个开头:

我将用前缀表示法重写你的表达;运算符是第一个,其他值遵循,所以:

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))