Wow, this is great stuff. I'll have to spend some time trying it out.
My big question, though, is how to interact with this stored query
using and_ and or_?
I went off on a different track where I would store a list of filter
objects with their respective method (and_, or_), and put them back
together in a nested filter beast like so:
# filter_list is a list of tuples: ( filter_object, filter_method)
nested = None
for filter, method in filter_list:
if not nested:
nested = filter
else:
nested = method( filter, nested )
query = query.filter( nested )
res = query.all()
If instead I stored the query object, how would I then and_ and or_
it?
Thanks a lot Michael. This is extremely helpful and gracious.
- Adam
On Nov 6, 3:15 pm, Michael Bayer <[EMAIL PROTECTED]> wrote:
> On Nov 6, 2008, at 12:28 AM, Adam Ryan wrote:
>
>
>
> > I can't store the query object in the beaker session because it can't
> > be pickled, right?. So is there a way to dump a string representation
> > of a query object, then recreate it and associate it with a new SQLA
> > Session?
>
> > Or am I missing the obvious? Thanks again for the help.
>
> OK, after some cobbling I have a great solution for this, I built a
> custom pickler/unpickler which stores key objects sparsely on the
> pickle side, can rebind back to any metadata/session/engine on the
> unpickle side. So you can pickle a whole Query object, or whatever,
> with no problem. The size of the string is still a few thousand
> characters but not nearly as huge as it would be if it was pickling
> the whole map of Table and mapper objects associated.
>
> Check out the svn trunk, and usage is as follows (this is from the
> docstring):
>
> from sqlalchemy.ext.serializer import loads, dumps
> metadata = MetaData(bind=some_engine)
> Session = scoped_session(sessionmaker())
>
> # ... define mappers
>
> query =
> Session
> .query
> (MyClass).filter(MyClass.somedata=='foo').order_by(MyClass.sortkey)
>
> # pickle the query
> serialized = dumps(query)
>
> # unpickle. Pass in metadata + scoped_session, both are optional
> depending on what you're deserializing
> query2 = loads(serialized, metadata, Session)
>
> print query2.all()
>
> this is all brand new code and several structures have special
> serialization procedures. If you're playing with it and get errors,
> we probably need to add more structures to the list of special-needs
> objects. The unit tests are fleshing out a good deal of scenarios so
> far but I can think of more which haven't been tested yet.
>
> For usage with Beaker, you're going to want to do this serialization
> procedure by hand and then place the resulting string in the session,
> then use the specialized loads() on the way out.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---