I've taken another look at trying to eager load the address.parent.  Is it 
possible to do that?

I've tried a couple of ways, pasted a below.  My full code is at: 
https://gist.github.com/vfr292/a5939418285e4c8bd03b

eager_addresses = session.query(Address).options(joinedload(Address.parent))

#error sqlalchemy.exc.ArgumentError: mapper option expects string key or 
list of attributes

eager_addresses = session.query(Address).options(joinedload
(Address.association).joinedload(Customer.assoc_cls.parent), joinedload
(Address.association).joinedload(Supplier.assoc_cls.parent)).all()

#not joining to Customer or Supplier

eager_addresses = session.query(Address).outerjoin(Address.association).
outerjoin
(Customer.assoc_cls.parent).options(contains_eager(Address.parent)).
outerjoin
(Supplier.assoc_cls.parent).options(contains_eager(Address.parent).all())

#error sqlalchemy.exc.ArgumentError: mapper option expects string key or 
list of attributes
Any advice on how I can eager load address.parent would be much appreciated 
:)

Sincere thanks,

~Victor

On Sunday, October 26, 2014 3:06:13 AM UTC-7, Michael Bayer wrote:
>
>
> On Oct 26, 2014, at 12:07 AM, Victor Reichert <vfr...@gmail.com 
> <javascript:>> wrote:
>
> Hi,
>
> I am following the "Generic Association with Discriminator on Association" 
> example at:
>
>
> http://docs.sqlalchemy.org/en/latest/_modules/examples/generic_associations/discriminator_on_association.html
>
> However, I would like to eager load the customer.addresses in a query like
>
> eager_sales_persons = session.query(SalesPerson).options(joinedload
> (SalesPerson.customers).joinedload(Customer.addresses))
>
> #with SalesPerson being a class I added with a relationship to customers.
>
> However, the above statement raises:  'AssociationProxy' object has no 
> attribute 'property'
>
> I tried eager_sales_persons = 
> session.query(SalesPerson).options(joinedload(SalesPerson.customers).joinedload(Customer.address_association).joinedload(AddressAssociation.addresses)).all()
>
> however, it would emit SQL for customer.addresses.
>
> I have made a pastie with my code at: http://pastie.org/9676017
>
> Is there a loader strategy that would work for my situation or a work 
> around for the AssociationProxy error?
>
>
> the second query is the right one, as currently there isn’t integration 
> between an association proxy attribute and loader options, meaning, you 
> have to state the joinedload() in terms of the actual relationship() as you 
> are doing.
>
> However I’m not seeing the problem:
>
> if we load as :
>
>
> session.query(SalesPerson).options(joinedload(SalesPerson.customers).joinedload(Customer.address_association).joinedload(AddressAssociation.addresses)).all()
>
> which you can also state like this:
>
>
> session.query(SalesPerson).options(joinedload(SalesPerson.customers).joinedload("address_association").joinedload(“addresses")).all()
>
> setting echo=True on create_engine(), the main query is:
>
> SELECT salesperson.id AS salesperson_id, salesperson.name AS 
> salesperson_name, address_association_1.id AS address_association_1_id, 
> address_association_1.discriminator AS address_association_1_discriminator, 
> address_1.id AS address_1_id, address_1.association_id AS 
> address_1_association_id, address_1.street AS address_1_street, 
> address_1.city AS address_1_city, address_1.zip AS address_1_zip, 
> customer_1.id AS customer_1_id, customer_1.name AS customer_1_name, 
> customer_1.sales_person_id AS customer_1_sales_person_id, 
> customer_1.address_association_id AS customer_1_address_association_id 
> FROM salesperson LEFT OUTER JOIN customer AS customer_1 ON salesperson.id 
> = customer_1.sales_person_id LEFT OUTER JOIN address_association AS 
> address_association_1 ON address_association_1.id = 
> customer_1.address_association_id LEFT OUTER JOIN address AS address_1 ON 
> address_association_1.id = address_1.association_id
>
>
> so in the FROM we have:   salesperson -> customer -> address_association 
> -> address
>
> that’s correct.  you’ll note three joinedload() calls, three links (->).
>
> then as the iteration proceeds, the sample calls upon address.parent. 
>  This emits this query for two entries:
>
> SELECT customer.id AS customer_id, customer.name AS customer_name, 
> customer.sales_person_id AS customer_sales_person_id, 
> customer.address_association_id AS customer_address_association_id 
> FROM customer 
> WHERE ? = customer.address_association_id
>
> not sure if that’s the query you’re referring to.  That’s Address.parent, 
> which is a proxy to CustomerAddressAssociation.parent, which is emitting a 
> lazy load.   As this is the non-FK side of a one-to-one, that’s also 
> correct.  A one-to-one is a special case of a one-to-many, basically, 
> uselist=False means, fetch a one-to-many collection, but only deal with the 
> first result.  CustomerAddressAssociation.parent is the backref of the 
> Customer.address_association many-to-one that’s stated in the joinedload().
>
> if this were a non-generic mapping where Customer.addresses were a 
> one-to-many and Address.parent were a many-to-one, you wouldn’t get that 
> extra load for Address.parent; a pure many-to-one is implicitly retrieved 
> from the database and cached that way when the one-to-many side is loaded. 
>  but in this case the “generic” mapping has flipped this around so that 
> Customer->AddressAssoiation is a many-to-one.
>
>
>
>
>
>
>
> Thank you so much for your help :)
>
> ~Victor
>
> -- 
> You received this message because you are subscribed to the Google Groups 
> "sqlalchemy" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to sqlalchemy+...@googlegroups.com <javascript:>.
> To post to this group, send email to sqlal...@googlegroups.com 
> <javascript:>.
> Visit this group at http://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/d/optout.
>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to