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