I wrote:
> Hi,
>
> Does accessing a backref always have to issue SQL, even if
> the object to
> be loaded already exists in the identity map? For example, if I have a
> many-to-one lazy-loaded relationship from Master to Detail with a
> backref, the statement "master.details[0].master" will issue
> SQL for the
> '.master' backref, even though it already exists in the
> session. I know
>
> [SNIP]
>
> So "query.get" doesn't issue a query, but "master.details[0].master"
> does. Is there any way of making the backref use query.get,
> and thereby
> use the identity map?
>
I delved into the source to find out how this works, and I see that the
LazyLoader strategy has an attribute 'use_get' which is meant to do
exactly this. However the test to see whether the lazywhere clause is
the same as the mapper's get() clause is failing:
In [1]: import satest2
In [2]: s = satest2.Detail.master.property.strategy
In [3]: s.mapper._get_clause[0].compare(s._LazyLoader__lazywhere)
Out[3]: False
In [4]: print s.mapper._get_clause[0]
master.id = ?
In [5]: print s._LazyLoader__lazywhere
master.id = ?
In [6]: print s.mapper._get_clause[0].left
master.id
In [7]: print s._LazyLoader__lazywhere.left
master.id
In [8]: print
s.mapper._get_clause[0].left.compare(s._LazyLoader__lazywhere.left)
False
So even though both clauses are binary expressions representing
"master.id = ?", the master.id in each case is different.
On the offchance, I changed the foreign key definition from:
master_id = sa.Column(sa.Integer, sa.ForeignKey(Master.id))
to
master_id = sa.Column(sa.Integer,
sa.ForeignKey(Master.__table__.c.id))
...and now it seems to work! So is this a bug?
Thanks,
Simon
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---