On Sep 7, 2011, at 5:09 PM, Sumeet Agarwal wrote:

> Still getting the hang of SQLAlchemy terminology.
> 
> I didn't mean a simple deferred() column, but a deferred column_property() 
> which defines a scalar select(). Like in the example here 
> http://www.sqlalchemy.org/docs/orm/mapper_config.html#sql-expressions-as-mapped-attributes.
> 
> My goal is to, instead of including a correlated subquery in the SELECT. The 
> column_property looks like

"My goal is to...", missing a verb there :).     If it were me, I'd think 
you're asking to unwrap the correlated subquery into a plain JOIN.   Since that 
works more efficiently.   

> 
> I'd rather do a separate query to load num_orders, rather than getting it 
> lazily or by using undefer(). It almost feels like I might want to define 
> num_orders as a relationship somehow? I dunno if what I would like to do maps 
> cleanly to a SQLAlchemy pattern.

Using relationship() is kind of the old school approach, but yup I think that 
actually allows you to get exactly subqueryload() for an attribute, so good 
idea !  a rare moment that SQLAlchemy amazes even me.   here's that since its 
faster for me to just illustrate

from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base

Base= declarative_base()

class Customer(Base):
    __tablename__ = 'customer'
    id = Column(Integer, primary_key=True)
    orders = relationship("Order")

    @property
    def num_orders(self):
        return self._num_orders.count if self._num_orders else 0

class Order(Base):
    __tablename__ = 'order'
    id = Column(Integer, primary_key=True)
    customer_id = Column(Integer, ForeignKey('customer.id'))

class OrderCount(object):
    pass
order_counts = select([Order.customer_id, 
func.count(Order.id).label('count')]).\
        group_by(Order.customer_id).alias()

mapper(
    OrderCount, 
    order_counts,
    primary_key=order_counts.c.customer_id
)

Customer._num_orders = relationship(OrderCount, uselist=False)

e = create_engine('sqlite://', echo=True)

Base.metadata.create_all(e)

s = Session(e)
s.add_all([
    Customer(orders=[Order(), Order(), Order()]),
    Customer(orders=[Order(), Order()]),
    Customer(orders=[]),
])
s.commit()

for c in s.query(Customer).options(subqueryload("_num_orders")):
    print c.id, c.num_orders










> 
> On Wed, Sep 7, 2011 at 7:51 AM, Michael Bayer <[email protected]> 
> wrote:
> For a deferred() itself, we don't have an option that does this.    Though 
> this is an unusual request.   If you definitely want the deferreds to load, 
> what's the issue having them render inline into the original query ?    The 
> advantage to "subqueryload" is primarily in that it loads multiple rows per 
> parent object efficiently, without re-fetching the full parent row many 
> times,  or needing to use a less efficient OUTER JOIN.   A deferred is always 
> one row per parent - and no join is needed anyway.
> 
> 
> 
> 
> On Sep 6, 2011, at 6:49 PM, Sumeet Agarwal wrote:
> 
> > I have a collection of deferred `ColumnProperty`s that I'd like to
> > start loading in subsequent queries. I know you can get this to happen
> > on the first access of a `ColumnProperty` that is deferred, but I
> > wonder if there's any way to specify this in the query.
> >
> > For relationships, `joinedload[_all()]` has a counterpart
> > `subqueryload[_all()]`. Is there nothing similar we can do for
> > `ColumnProperty`?
> >
> > --
> > 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.
> >
> 
> --
> 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.
> 
> 
> 
> -- 
> 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.

-- 
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.

Reply via email to