Would you add a StrategizedProperty is_eager() method?

class StrategizedProperty(MapperProperty):
...
    @property
    def is_eager(self):
        return self.lazy in (False, 'joined', 'subquery')
...


Actually, I guess it would belong as part of class
RelationshipProperty instead.

Kent


On Mar 5, 11:54 am, Michael Bayer <mike...@zzzcomputing.com> wrote:
> On Mar 5, 2011, at 11:44 AM, Kent wrote:
>
> > Yep, works excellent (the "Why??" I asking about why is it wrong to
> > invoke "prop.do_init()" instead of StrategizedProperty.do_init(prop))
>
> oh.  because you don't want to rerun all the initialization crap in 
> RelationshipProperty which I'm not even sure supports being run on itself 
> twice.   So just StrategizedProperty's part is run.  
>
> this of course could be a public API function, but then it falls into the 
> why-is-1%-of-SQLA-configuration-mutable-and-not-the-other-99% issue we had 
> like when you were mutating table.c that time.
>
>
>
> > On Mar 5, 11:31 am, Michael Bayer <mike...@zzzcomputing.com> wrote:
> >> On Mar 5, 2011, at 11:18 AM, Kent wrote:
>
> >>> Thank you!
>
> >>> I don't disagree: I've been brainstorming how to work it out upfront,
> >>> but I think I'd need your topological sort to put the mappers in the
> >>> correct dependency order and since it is legacy support, I'm ok with
> >>> the non public API and potential consequences.
>
> >>> I had tried prop.do_init() in place of
> >>> StrategizedProperty.do_init(prop), but it failed.
>
> >>> Why???  (would invoke RelationshipProperty.do_init(), but I would have
> >>> guess that was the correct method instead of StrategizedProperty's)
>
> >> here it is:
>
> >> from sqlalchemy import *
> >> from sqlalchemy.orm import *
> >> from sqlalchemy.ext.declarative import declarative_base
> >> Base = declarative_base()
>
> >> class Parent(Base):
> >>     __tablename__ = 'parent'
> >>     id = Column(Integer, primary_key=True)
>
> >>     children = relationship("Child", lazy='joined', 
> >> backref=backref('parent', lazy='joined'))
>
> >> class Child(Base):
> >>     __tablename__ = 'child'
> >>     id = Column(Integer, primary_key=True)
> >>     parent_id = Column(Integer, ForeignKey('parent.id'))
>
> >> compile_mappers()
>
> >> from sqlalchemy.orm import strategies, interfaces
>
> >> for prop in (Parent.children.property, Child.parent.property):
> >>     prop.strategy_class = strategies.factory('subquery')
> >>     interfaces.StrategizedProperty.do_init(prop)
>
> >> e = create_engine('sqlite://', echo=True)
> >> Base.metadata.create_all(e)
> >> s = Session(e)
>
> >> s.add(Parent(children=[Child(), Child()]))
> >> s.commit()
>
> >> print "----------------------"
> >> s.query(Parent).all()
> >> s.close()
>
> >> print "----------------------"
> >> s.query(Child).all()
>
> >>> On Mar 5, 11:04 am, Michael Bayer <mike...@zzzcomputing.com> wrote:
> >>>> On Mar 5, 2011, at 10:37 AM, Kent wrote:
>
> >>>>> Oracle 8 strikes again.  But our client's current legacy application
> >>>>> requires it (until we can get them off the app).
>
> >>>>> Anyway, when Oracle 8 is detected, I wish to convert certain mapper
> >>>>> properties' lazy attribute from False => 'subquery' because oracle 8
> >>>>> isn't smart enough to run the query anywhere near efficiently (but 9i
> >>>>> is).
>
> >>>>> So, after all the mappers are compiled (I need backrefs also), I'm
> >>>>> looping through the _mapper_registry and detecting which properties
> >>>>> need to be converted if the oracle is 8i.
>
> >>>>> Unfortunately for me:
> >>>>>      prop.lazy = 'subquery'
> >>>>>      prop.strategy_class = strategies.factory('subquery')
>
> >>>>> isn't enough because the prop.strategy was already initialized I
> >>>>> surmise.
>
> >>>>> Because of potential circular references and complications with
> >>>>> backrefs and future mapped classes not being mapped to a table until
> >>>>> after mapper() is invoked for the class, I do not think I can figure
> >>>>> out whether lazy should be False vs. 'subquery' during the mapper()
> >>>>> invocation...(at least trivially), so I am waiting until after all
> >>>>> mappers are compiled.
>
> >>>>> Can you think of any solutions for me?  Any way to change a properties
> >>>>> lazy attribute after it's been instantiated?  Any way to clone the
> >>>>> property and replace it with a new one with a difference lazy
> >>>>> attribute?
>
> >>>> If it were me I'd still try to solve the problem of deciding which 
> >>>> relationships/backrefs need the setting up front.   You can limit it to 
> >>>> those who are setting up lazy="joined" I assume, and i'd consider 
> >>>> getting ugly too with some hardcoding, since this is for legacy support 
> >>>> anyway.
>
> >>>> Otherwise the internal API magic you need would be:
>
> >>>>         from sqlalchemy.orm.interfaces import StrategizedProperty
>
> >>>>         prop.strategy_class = strategies.factory('subquery')
> >>>>         StrategizedProperty.do_init(prop)
>
> >>>> which would reset the "self.strategy" attribute and the collection of 
> >>>> alternate strategies.
>
> >>> --
> >>> 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 
> >>> sqlalchemy+unsubscr...@googlegroups.com.
> >>> For more options, visit this group 
> >>> athttp://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 sqlalchemy@googlegroups.com.
> > To unsubscribe from this group, send email to 
> > sqlalchemy+unsubscr...@googlegroups.com.
> > For more options, visit this group 
> > athttp://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 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