Hi Diana & Michael Bayer,

you both have exactly the same results/sql queries, but unfortunately my 
results are different. This is really strange,
here is my complete python script with my output: 
http://pastebin.com/CyCs90cW

In my case the lazy='subquery' parameter have no effect and the sql queries 
differs from yours. 


Am Donnerstag, 22. November 2012 16:00:41 UTC+1 schrieb Michael Bayer:
>
> what is awkward about this mapping is that the "myChildren" relationship 
> is established twice, specific to the Men and Woman subclasses.  SQLAlchemy 
> doesn't have any with_polymorphic instruction here when it loads Human 
> objects, so when you say Human->(some attribute that is only on Men/Woman) 
> it has no choice but to load the additional columns local to Men and Woman, 
> then loads the myChildren relationship.  The instruction to load "Human" 
> objects with an eagerload to "myChildren" is a meaningless instruction - 
> "Human" *does not have* a "myChildren" relationship.    When you load Human 
> objects, the fact that some may be Men and some may be Woman is not known 
> at query time - it is only known after the rows are loaded, and it's too 
> late to make decisions about eager loads on attributes specific to those 
> subclasses. 
>
> As far we query(Woman).one(), if the Woman object is already present in 
> the Session then its attributes are not refreshed and the subqueryload for 
> "myChildren" won't emit. 
>
> If I load "Woman" with a clean session, the SQL is as expected: 
>
> session.close() 
> woman = session.query(Woman).one() 
> print woman.myChildren 
>
>
>
> SELECT human.type AS human_type, human.id AS human_id, woman.id_human AS 
> woman_id_human 
> FROM human JOIN woman ON human.id = woman.id_human 
> 2012-11-22 09:58:46,474 INFO sqlalchemy.engine.base.Engine () 
> 2012-11-22 09:58:46,475 INFO sqlalchemy.engine.base.Engine SELECT 
> anon_1.human_type AS anon_1_human_type, anon_1.human_id AS anon_1_human_id, 
> anon_1.child_id_human AS anon_1_child_id_human, anon_1.child_age AS 
> anon_1_child_age, anon_2.woman_id_human AS anon_2_woman_id_human 
> FROM (SELECT woman.id_human AS woman_id_human 
> FROM human JOIN woman ON human.id = woman.id_human) AS anon_2 JOIN 
> woman_child AS woman_child_1 ON anon_2.woman_id_human = 
> woman_child_1.woman_id JOIN (SELECT human.type AS human_type, human.id AS 
> human_id, child.id_human AS child_id_human, child.age AS child_age 
> FROM human JOIN child ON human.id = child.id_human) AS anon_1 ON 
> anon_1.child_id_human = woman_child_1.child_id ORDER BY 
> anon_2.woman_id_human 
>
>
>
>
> On Nov 22, 2012, at 9:49 AM, Diana Clarke wrote: 
>
> > Hmm.... maybe I'm missing something. Perhaps someone else can jump in, 
> > and show me what I'm missing? 
> > 
> > When I take your code, and execute the following 5 cases: 
> > 
> >    CASE A: no 'subquery' on relationship, 'subqueryload' on query 
> >    CASE B: 'subquery' on relationship, no 'subqueryload' on query 
> >    CASE C: no 'joined' on relationship, 'joinedload' on query 
> >    CASE D: 'joined' on relationship, no 'joinedload' on query 
> >    CASE E: no 'joined' or 'subquery' on relationship, no 'joinedload' 
> > or 'subqueryload' on query 
> > 
> > 1) The queries in cases A & B are equal (exactly 2 queries each) 
> > 2) The queries in cases C & D are equal (exactly 1 query each) 
> > 3) Case E is completely lazy, there are exactly 1 + N queries 
> > 
> > Here are the notes I kept, as I tested those cases: 
> > 
> >    http://pastebin.com/hx0Kj4An 
> > 
> > Martin: perhaps create a new pastebin that shows exactly what you're 
> > doing (including table/engine/session creation, data population, etc), 
> > so that I have a better chance of seeing what you're seeing? 
> > 
> >    http://pastebin.com/mcum0c7Q 
> > 
> > --diana 
> > 
> > On Thu, Nov 22, 2012 at 6:09 AM, Martin84 
> > <stek...@googlemail.com<javascript:>> 
> wrote: 
> >> Hi Diana, 
> >> 
> >> thank you for your help, but unfortunately my problem still exists. 
> >> In my case the lazy attribute for the myChildren relationship has 
> absolutely 
> >> no effect! 
> >> At this point one more information is important: I build and populate 
> the 
> >> database with one session, and then open a new session and call 
> >> showDatabase. 
> >> If you populate the database with one session, and then call 
> showDatabase 
> >> with the same (now not empty) session, 
> >> then the instances are already in the session and sqlalchemy don't fire 
> new 
> >> queries for access to the myChildren attribute of human. 
> >> So, it is important to call showDatabase with an empty session to 
> reproduce 
> >> my issue. 
> >> 
> >> One more information could be important: 
> >> If I load a woman instance and access myChildren with: 
> >> 
> >> woman = session.query(Woman).one() 
> >> print woman.myChildren 
> >> 
> >> then sqlalchemy emits an extra sql query on the access to myChildren 
> and 
> >> ignore my lazy='subquery' or lazy='joined' parameter for the mychildren 
> >> relationship configuration. 
> >> But if I modify the query like this: 
> >> 
> >> woman = session.query(Woman).options(subqueryload('myChildren')).one() 
> >> print woman.myChildren 
> >> 
> >> then sqlalchemy load the woman and all children at once! Exactly what I 
> >> need. 
> >> But this makes completely no sense to me, i thought that subqueryload() 
> just 
> >> overload the load strategie for a relationship. 
> >> So myChildren = relationship('Child', secondary=link_table, 
> lazy='subquery') 
> >> and subqueryload('myChildren') should be equivalent. 
> >> Why is there a difference? 
> >> 
> >> 
> >> 
> >> 
> >> 
> >> 
> >> 
> >> -- 
> >> You received this message because you are subscribed to the Google 
> Groups 
> >> "sqlalchemy" group. 
> >> To view this discussion on the web visit 
> >> https://groups.google.com/d/msg/sqlalchemy/-/GponYdm2PLsJ. 
> >> 
> >> To post to this group, send email to 
> >> sqlal...@googlegroups.com<javascript:>. 
>
> >> To unsubscribe from this group, send email to 
> >> sqlalchemy+...@googlegroups.com <javascript:>. 
> >> For more options, visit this group at 
> >> http://groups.google.com/group/sqlalchemy?hl=en. 
> > 
> > -- 
> > You received this message because you are subscribed to the Google 
> Groups "sqlalchemy" group. 
> > To post to this group, send email to 
> > sqlal...@googlegroups.com<javascript:>. 
>
> > To unsubscribe from this group, send email to 
> sqlalchemy+...@googlegroups.com <javascript:>. 
> > For more options, visit this group at 
> http://groups.google.com/group/sqlalchemy?hl=en. 
> > 
> > 
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/sqlalchemy/-/ftxSziH3hD4J.
To post to this group, send email to sqlalchemy@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to