Thank you very much.

Le lundi 31 août 2015 06:17:37 UTC+3, Michael Bayer a écrit :
>
>
>
> On 8/29/15 2:27 PM, [email protected] <javascript:> wrote:
>
> Thanks for the reply.
>
> Le vendredi 28 août 2015 18:52:37 UTC+3, Michael Bayer a écrit : 
>
>
>
> On 8/28/15 3:51 AM, [email protected] wrote:
>
> Another question is why sqlalchemy produce two queries to get hardwares 
> collections from a dispositif :
>
>
> >>> some_disp.hardwares
> 2015-08-28 10:36:41,722 INFO sqlalchemy.engine.base.Engine SELECT disp_hdw
> .iddispositif AS disp_hdw_iddispositif, disp_hdw.idhardware AS 
> disp_hdw_idhardware, disp_hdw.instance AS disp_hdw_instance
> FROM disp_hdw
> WHERE %s = disp_hdw.iddispositif
> 2015-08-28 10:36:41,725 INFO sqlalchemy.engine.base.Engine (2721L,)
> 2015-08-28 10:36:41,768 INFO sqlalchemy.engine.base.Engine SELECT hardware
> .hdw_type AS hardware_hdw_type, hardware.id AS hardware_id, hardware.idbox 
> AS hardware_idbox
> FROM hardware
> WHERE hardware.id = %s
> 2015-08-28 10:36:41,772 INFO sqlalchemy.engine.base.Engine (268L,)
>
>
> There's no context given here, but that would indicate that the 
> "some_disp" instance has been expired.  When you .commit() a session, all 
> objects are expired by default.  This is so that if, when you next operate 
> on the objects, some other transaction has deleted that row, the session 
> can let you know that you're working on stale data.   See the session docs 
> for options on how to control this behavior.
>
>  
> Here the context, all in the same session :
>
> >>> from dbaccess import *    # import engine, Base and tables objects
> >>> from sqlalchemy.orm.session import sessionmaker
> >>> Session = sessionmaker(bind=engine)
> >>> session = Session()
> >>> l = session.query(Dispositif).all()
> >>> some_disp = l[-2]
> >>> engine.echo = True
> >>> some_disp.hardwares
> 2015-08-29 20:34:30,972 INFO sqlalchemy.engine.base.Engine SELECT disp_hdw
> .iddispositif AS disp_hdw_iddispositif, disp_hdw.idhardware AS 
> disp_hdw_idhardware, disp_hdw.instance AS disp_hdw_instance
> FROM disp_hdw
> WHERE %s = disp_hdw.iddispositif
> 2015-08-29 20:34:30,975 INFO sqlalchemy.engine.base.Engine (2721L,)
> 2015-08-29 20:34:31,018 INFO sqlalchemy.engine.base.Engine SELECT hardware
> .hdw_type AS hardware_hdw_type, hardware.id AS hardware_id, hardware.idbox 
> AS hardware_idbox
> FROM hardware
> WHERE hardware.id = %s
> 2015-08-29 20:34:31,022 INFO sqlalchemy.engine.base.Engine (268L,)
>
>
> oh.   Well this is association proxy, which means it needs to load two 
> separate relationships, so that is two SELECT statements with default 
> loader strategy.
>

OK.

In fact, *hardwares* can be retrieved in one query.
>
> instead of somewhat like :
>
> SELECT hardware.hdw_type AS hardware_hdw_type, hardware.id AS hardware_id, 
> hardware.idbox AS hardware_idbox
> FROM hardware
> JOIN disp_hdw ON hardware.id = disp_hdw.idhardware
> WHERE disp_hdw.iddispositif = %s
>
>
> sure thing, use joined eager loading:
>
> http://docs.sqlalchemy.org/en/rel_1_0/orm/loading_relationships.html
>

If I try :
>>> x = db.query(Dispositif).options(joinedload(Dispositif.
hardware_collection)).get(2721)

I got an error : sqlalchemy.exc.ArgumentError: mapper option expects string 
key or list of attributes.

But it's still possible to "preload" the association part by using :
>>> x = db.query(Dispositif).options(joinedload(Dispositif.
disp_hdw_collection)).get(2721)

So calling x.hardware_collection after that produce only one query.

Is there a better way to do ?

> Le vendredi 28 août 2015 10:20:55 UTC+3, [email protected] a écrit :
>
> Hello, 
>
> I want to use assocation proxy pattern 
> <http://docs.sqlalchemy.org/en/latest/orm/extensions/associationproxy.html> 
> with automap. I tried this code :
>
>
> Base = automap_base()
>
> class Dispositif(Base):
>     __tablename__ = 'dispositifs'
>     hardwares = association_proxy('disp_hardwares', 'hardware')
>
> class Hardware(Base):
>     __tablename__ = 'hardware'
>
> Base.prepare(engine, reflect=True)
>
> but it does not work.
>
> Any help appreciated.
>
> Best regards
>
> -- 
> 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 [email protected].
> To post to this group, send email to [email protected].
> Visit this group at 
>
> ...

-- 
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 [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to