On 26 Aug 2013, at 19:15, lars van gemerden <l...@rational-it.com> wrote:
> 
> On Monday, August 26, 2013 5:23:07 PM UTC+2, Michael Bayer wrote:
> 
> On Aug 26, 2013, at 11:14 AM, lars van gemerden <la...@rational-it.com> wrote:
> 
>> Hi all,
>> 
>> This might be a bit of a stretch but here it goes:
>> 
>> Say that i have a lambda function that takes a mapped object and teturns 
>> whether it is valid; e.g:
>> 
>>     lambda person: person.age > 17 or person.length > 1.75
>> 
>> is it possible to use this method to perform an sqla query on the database? 
>> Perhaps by using hybrid_method?
>> 
>> Cheers, Lars
>> 
>> PS: this might seem strange question, but it would save me a lot of work 
>> and/or would make my internal and user interfaces a lot more consistent. 
>> 
>> PPS: i do also have a string representation of the lambda functions, if that 
>> helps
> 
> 
> I'm not sure if you need these to remain as lambdas, sure you can just pass 
> it to a hybrid_method:
> 
> class MyClass(Base):
>     # ....
> 
>    @hybrid_method
>    def run_compare(self, fn, *args):
>         return fn(*args)
> 
> 
> query(MyClass).filter(MyClass.run_compare(some_lambda, some_other_object))
> 
>  
> 
> Hi Michael,
> 
> So just to be sure, if i understand correctly and i have:
> 
>    func  = lambda person: person.age > 17 or person.length > 1.75
> 
> I can do:
> 
>    class Person(Base):
>        # ....
> 
>       @hybrid_method
>       def run_filter(self, fn):
>            return fn(self)
> 
>   session.query(MyClass).filter(MyClass.run_compare(func))
> 
> to get all objects of class Person where obj.age>17 or obj.length>1.75  
> 
> Is that without loading all records and filtering afterwards??
> 
> That's pretty impressive i think (and really helpful to me personally)
> 
> Cheers, Lars


As long as your function returns something meaningful when called with the 
class (Person) rather than an instance, it should be fine.

Unfortunately I'm not sure your example will work, because "<expr> or <expr>" 
isn't something that SQLAlchemy can convert into an SQL statement. If you were 
able to use the bitwise "or" operator "|" instead, that would do the right 
thing. See the "contains" and "intersects" methods in the first example on 
http://docs.sqlalchemy.org/en/rel_0_8/orm/extensions/hybrid.html.

Hope that helps,

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 sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to