As regards the "attribute" in MappedObject.__dict__, I for one use it on an
object which has an attribute whose primary role is to keep a work
history which can get large. Sometimes, if the list has already been
loaded, it's easier to simply add a new row to the already-loaded
history. Sometimes if the history is not loaded, it makes more sense
to do a one-off insert (via
session.save()) of the new item to avoid incurring an uneeded load of
lots of rows.


As for using the attribute as query, I agree with Mike that attributes
should maintain their special character, but I can see a case for extracting
a query from the attribute to do arbitrary operations that don't impact the
relation or the attribute itself. Given that that session.query() is now
generative, this seems like a natural fit for the feature - turn an
attribute into a query that you can do with as you please, the attribute
remains as-is.



On 3/26/07, Gaetan de Menten <[EMAIL PROTECTED]> wrote:
>
>
> On 3/26/07, Michael Bayer <[EMAIL PROTECTED]> wrote:
> > On Mar 26, 2007, at 6:15 AM, Gaetan de Menten wrote:
> > > though, as a user, I'd prefer the first solution.
> > >
> > > Wouldn't that be possible? I think it should be. You only need to keep
> > > the deferred approach of the InstrumentedList that I demonstrated in
> > > my patch, so that the whole list is not fetched before we get the
> > > query object, which would ruin the whole idea. Of course it was only a
> > > proof-of-concept patch, but I think it should be fixable.
> >
> > my various issues with the deferred thing are as follows.   note that
> > im not putting these out there as "this is why we arent doing it", im
> > putting it out there as "this is why it makes me uncomfortable".
> >
> > the current use case of "has my lazy list been loaded?" is:
> >
> > "addresses" in myobject.__dict__
>
> I didn't know about that subtlety... But is this really a common case?
> I can't think of any practical case (outside the internals of
> SQLAlchemy) where you'd want to do that. I guess I'm probably lacking
> imagination here :)
>
> > with deferred list, now we have to have a list element actually
> > present there (but still loaded, maybe not).  so detecting when an
> > attribute requires its callable fired off or not gets thorny...
>
> > also
> > breaks code for those who do it the above way, but also we need to
> > add some new way to accomplish the above,
>
> True, but IMHO, it's worth it, since it breaks something which _I
> think_ is rarely used, to bring something which _I think_ would be
> used more widely once people know about it. The problem is that I
> might be wrong.
>
> > which will probably have to
> > be some messy function call like "attribute_manager.is_loaded
> > (myobject, "addresses")".
>
> How about an "is_loaded" method on the InstrumentedList itself?
>
> > generally theres all sorts of places where we want to get at the
> > attribute and fire it off, not fire it off (internally known as
> > "passive"), etc. and the awareness of the "deferred" list there would
> > have to be more deeply embedded throughout the attributes module for
> > everything to keep working.  so my discomfort grows that we are
> > changing the APIs of attributes.py, probably including its public
> > API, just to suit something that IMHO is strictly for visual appeal.
>
> Well, I disagree here (I guess you expected that ;-))... It's both
> shorter to type and more readable that having to do the query manually
> each time. And btw, if you think like that, you could say that
> SQLAlchemy is only for visual appeal, since you could as well issue
> the SQL statements to your db cursors by hand. But let's not start a
> troll here.
>
> > also, while it looks cleaner, there is still a semantic co-mingling
> > that im not very comfortable with.   i.e. that a collection of
> > persisted objects on a parent class doubles as a database query
> > object. to me the meaning of those two things is entirely different,
>
> I understand your point, and I agree that they are currently different
> concepts, but I have a deep feeling that they don't necessarily have
> to be. The collection is, after all, only a particular query which has
> been "concretized". I think it should be possible to get rid entirely
> of the "concretized" collection altogether, and only use queries. Ie:
> user.address is just an automatically-built query. It would feel very
> natural to me. Of course, in that case, we'd have to support tracking
> of objects added/removed/etc in a "query" (ie partial collection) like
> you do in the collection, but I don't think it would be _that_ hard.
>
> Ok, now the problem is that, even though I think it would be
> theorically feasible and super-cool to have, it would be a major
> refactor of the code breaking the API in some cases and you might not
> want to do that.
>
> BTW: this is what I meant in my first mail by "I _think_ the best way
> to go would be if InstrumentedList would hold a "preconfigured" query
> object"...
>
> Ok, now you call me crazy if you like. I'm currently having this "gut
> feeling" that this is the way to go, but maybe I'm missing something
> enormous because I don't see the whole picture like you do.
>
> > and i think the decline of an API starts with minor conflation of
> > concepts.
>
> That's so true.
>
> Now, if I failed to convince you, you might agree with a less invasive
> (but unfortunately also less beautifull/readable/practical) change
> like a function or method somewhere to create a query from an
> attribute:
>
> make_query(user, 'addresses')
> or
> make_query(User.addresses, user)
> or
> Query.from_attr(user, 'addresses')
>
> or anything similar... You get the idea...
>
> --
> Gaƫtan de Menten
> http://openhex.org
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to