2011-09-15 4 views
0

Je veux appliquer un certain type de mécanisme de règle d'accès, pour que je prévois d'utiliser la liste des tuple pour spécifier des règles de restrictions comme ci-dessous
['|',('name','=','root'), ('role','=','admin')] en utilisant les notations postfix ...sqlalchemy Evalulate Critères basés sur la liste de tuple, recherche?

est-il un mécanisme existant python qui peut me aider à convertir ces domaines en requête sqlalchemy lang comme

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

+0

Non, mais vous pouvez construire un. Voir aussi http://stackoverflow.com/questions/7411812/how-to-create-literal-based-query-in-sqlalchemy pour une question connexe récente. – van

Répondre

2

Voici un début d'un:

Je vais réécrire vos expres sion en termes de notation de préfixe; l'opérateur est d'abord et les autres valeurs suivent, donc:

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

mais vous pouvez probablement ajouter quelques contrôles plus spécifiques de l'opérateur pour gérer les opérateurs dans d'autres endroits.

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} 

Et pour l'utiliser, passez la classe mappée que vous souhaitez utiliser la requête avec:

session.query(User).filter(build_query(User, test_expression)) 
Questions connexes