Re: [sqlalchemy] subqueryload for a ColumnProperty?

2011-09-11 Thread Sumeet Agarwal
 in set (0.00 sec)


I tried adding `anon_1.customer_id = 46` to the outer query's WHERE clause
since I'm pretty sure that's easily expressed with SQLAlchemy, but it didn't
help at all. Would it be easy to keep OrderCount defined as a relationship,
but somehow add a filter to the mapped select at runtime? Seems like then,
I'd be all set.

Thank you for the help.

On Wed, Sep 7, 2011 at 2:39 PM, Michael Bayer mike...@zzzcomputing.comwrote:


 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 mike...@zzzcomputing.comwrote:

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

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



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


  --
 You received this message because you are subscribed to the Google Groups

Re: [sqlalchemy] subqueryload for a ColumnProperty?

2011-09-07 Thread Sumeet Agarwal
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

Customer.num_orders = orm.column_property(
select([func.count(Order.id)])\
.where(Order.customer_id == Customer.id)\
.correlate(Customer.__table__),
deferred=True
)


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.

On Wed, Sep 7, 2011 at 7:51 AM, Michael Bayer mike...@zzzcomputing.comwrote:

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

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



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



[sqlalchemy] subqueryload for a ColumnProperty?

2011-09-06 Thread Sumeet Agarwal
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 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.