On Fri, Feb 22, 2013 at 1:31 AM, Jonathan Vanasco <[email protected]> wrote:
> basd on a bunch of error messages, this example works...
>
> criteria = ( ('male',35),('female','35) )
> query = session.query( model.Useraccount )
> ands = []
> for set_ in criteria :
> ands.append(\
> sqlalchemy.sql.expression.and_(\
> model.Useraccoun.gender == set_[0] ,
> model.Useraccoun.age == set_[1] ,
> )
> )
> query = query.filter(\
> sqlalchemy.sql.expression.or_( *ands )
> )
> results= query.all()
>
> this seems really awkward though. is there a better way to build up a
> set of dynamic "or" criteria ?
>
It doesn't look too awkward to me - what sort of API would you prefer?
Note that and_ and or_ are available in the top-level "sqlalchemy"
namespace. Also, backslashes aren't necessary on the end of lines when
you're inside brackets, so your example could actually look like this:
import sqlalchemy as sa
criteria = (('male', 35), ('female', 35))
Useraccount = model.Useraccount
query = session.query(Useraccount)
ands = []
for gender, age in criteria:
ands.append(
sa.and_(
Useraccount.gender == gender,
Useraccount.age == age,
)
)
query = query.filter(sa.or_(*ands))
results= query.all()
It's entirely subjective, but I find that easier to read.
You can also use "&" and "|" but I think you have to be a little
careful with operator precedence. You can probably write this:
ands.append((Useraccount.gender == gender) & (Useraccount.age == age))
Simon
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sqlalchemy?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.