OK, thank a lot !

Le jeudi 13 juillet 2017 06:01:45 UTC+3, Mike Bayer a écrit :
>
> this is how that would have to be mapped, hypothetically: 
>
> class EngineerBase(Person): 
>     __tablename__ = 'engineer' 
>
>     id = Column(ForeignKey('person.id'), primary_key=True) 
>     engineer_name = Column(String(30)) 
>
>     __mapper_args__ = { 
>         'polymorphic_load': 'selectin' 
>     } 
>
>
> class EngineerType1(EngineerBase): 
>     __mapper_args__ = { 
>         'polymorphic_identity': 'engineer_t1', 
>         'polymorphic_load': 'inline' 
>     } 
>
>
> class EngineerType2(EngineerBase): 
>     __mapper_args__ = { 
>         'polymorphic_identity': 'engineer_t2', 
>         'polymorphic_load': 'inline' 
>     } 
>
>
> doesn't work of course since the polymorphic selectin load is a new 
> feature trying to work its way into a very intricate workflow.  I 
> threw up 
> https://bitbucket.org/zzzeek/sqlalchemy/issues/4026/mixing-selectin-load-on-top-of-inline
>  
> to look into it.  not sure how easy / hard it would be. 
>
> On Wed, Jul 12, 2017 at 7:09 PM,  <yoch....@gmail.com <javascript:>> 
> wrote: 
> > Here a MCWE : 
> > 
> > from sqlalchemy import Table, Column, Integer, String, ForeignKey, 
> > create_engine 
> > from sqlalchemy.orm import Session 
> > from sqlalchemy.ext.declarative import declarative_base 
> > 
> > 
> > Base = declarative_base() 
> > 
> > 
> > class Person(Base): 
> >     __tablename__ = 'person' 
> > 
> >     id = Column(Integer, primary_key=True) 
> >     type = Column(String(50), nullable=False) 
> >     name = Column(String(50)) 
> > 
> >     __mapper_args__ = { 
> >         'polymorphic_identity': 'person', 
> >         'polymorphic_on': type 
> >     } 
> > 
> > 
> > class Manager(Person): 
> >     __tablename__ = 'manager' 
> > 
> >     id = Column(ForeignKey('person.id'), primary_key=True) 
> >     manager_name = Column(String(30)) 
> > 
> >     __mapper_args__ = { 
> >         'polymorphic_identity': 'manager', 
> >         'polymorphic_load': 'selectin' 
> >     } 
> > 
> > 
> > class EngineerBase(Person): 
> >     __tablename__ = 'engineer' 
> > 
> >     id = Column(ForeignKey('person.id'), primary_key=True) 
> >     engineer_name = Column(String(30)) 
> > 
> > 
> > class EngineerType1(EngineerBase): 
> >     __mapper_args__ = { 
> >         'polymorphic_identity': 'engineer_t1', 
> >         'polymorphic_load': 'selectin' 
> >     } 
> > 
> > 
> > class EngineerType2(EngineerBase): 
> >     __mapper_args__ = { 
> >         'polymorphic_identity': 'engineer_t2', 
> >         'polymorphic_load': 'selectin' 
> >     } 
> > 
> > 
> > engine = create_engine('sqlite://') 
> > Base.metadata.create_all(engine) 
> > 
> > engine.echo = True 
> > 
> > session = Session(engine) 
> > 
> > eng1 = EngineerType1() 
> > eng2 = EngineerType2() 
> > 
> > session.add_all([eng1, eng2]) 
> > session.commit() 
> > 
> > session.query(Person).all() 
> > 
> > produces the following three queries : 
> > 
> > 2017-07-13 00:59:07,243 INFO sqlalchemy.engine.base.Engine SELECT 
> person.id 
> > AS person_id, person.type AS person_type, person.name AS person_name 
> > FROM person 
> > 2017-07-13 00:59:07,243 INFO sqlalchemy.engine.base.Engine () 
> > 2017-07-13 00:59:07,248 INFO sqlalchemy.engine.base.Engine SELECT 
> > engineer.id AS engineer_id, person.id AS person_id, person.type AS 
> > person_type 
> > FROM person JOIN engineer ON person.id = engineer.id 
> > WHERE person.id IN (?) AND person.type IN (?) ORDER BY person.id 
> > 2017-07-13 00:59:07,249 INFO sqlalchemy.engine.base.Engine (2, 
> > 'engineer_t2') 
> > 2017-07-13 00:59:07,253 INFO sqlalchemy.engine.base.Engine SELECT 
> > engineer.id AS engineer_id, person.id AS person_id, person.type AS 
> > person_type 
> > FROM person JOIN engineer ON person.id = engineer.id 
> > WHERE person.id IN (?) AND person.type IN (?) ORDER BY person.id 
> > 2017-07-13 00:59:07,254 INFO sqlalchemy.engine.base.Engine (1, 
> > 'engineer_t1') 
> > 
> > The last two queries can be grouped together. 
> > 
> > Le jeudi 13 juillet 2017 01:45:46 UTC+3, yoch....@gmail.com a écrit : 
> >> 
> >> I have a mixed configuration with both joined and single table 
> subclasses 
> >> in a two-levels inheritance (like that), so selectin seems to be the 
> right 
> >> choice for me. 
> >> 
> >> Le jeudi 13 juillet 2017 01:09:50 UTC+3, Mike Bayer a écrit : 
> >>> 
> >>> On Wed, Jul 12, 2017 at 4:54 PM,  <yoch....@gmail.com> wrote: 
> >>> > I noticed that {'polymorphic_load': 'selectin'} on single table 
> >>> > inheritance 
> >>> > can make several SQL queries unnecessarily. 
> >>> 
> >>> well "selectin" loading would be inappropriate for single table 
> >>> inheritance because you are telling it to emit additional queries for 
> >>> additional subclasses, when in reality you'd like the original query 
> >>> just to include all columns. For this reason the traditional 
> >>> "with_polymorphic" approach is more appropriate for eager loading of 
> >>> single table subclasses. 
> >>> 
> >>> 
> >>> > 
> >>> > 
> >>> > Le mercredi 12 juillet 2017 22:02:04 UTC+3, yoch....@gmail.com a 
> écrit 
> >>> > : 
> >>> >> 
> >>> >> Very awaited version for me (because the selectin) ! 
> >>> >> 
> >>> >> I tested in my code both the eagerload and the polymorphic usages, 
> and 
> >>> >> everything works perfectly. 
> >>> >> 
> >>> >> Thank you Mike 
> >>> >> 
> >>> >> Le lundi 10 juillet 2017 16:44:03 UTC+3, Mike Bayer a écrit : 
> >>> >>> 
> >>> >>> SQLAlchemy release 1.2.0b1 is now available. 
> >>> >>> 
> >>> >>> This is the first beta for the 1.2 series of SQLAlchemy. As is 
> always 
> >>> >>> the case for beta releases, the release is available on Pypi, but 
> >>> >>> only 
> >>> >>> installable when specifying the --pre flag with pip. 
> >>> >>> 
> >>> >>> Key highlights of version 1.2 include: 
> >>> >>> 
> >>> >>> * Connection pool pre-ping - The connection pool now includes an 
> >>> >>> optional "pre ping" feature that will test the "liveness" of a 
> pooled 
> >>> >>> connection for every connection checkout, transparently recycling 
> the 
> >>> >>> DBAPI connection if the database is disconnected. This feature 
> >>> >>> eliminates the need for the "pool recycle" flag as well as the 
> issue 
> >>> >>> of errors raised when a pooled connection is used after a database 
> >>> >>> restart. 
> >>> >>> 
> >>> >>> * New eagerloading features - an all-new eager loader called 
> >>> >>> "selectin" is added. This loader is similar to "subquery" eager 
> >>> >>> loading, but foregoes embedding a complex subquery in favor of 
> using 
> >>> >>> a 
> >>> >>> simple IN expression which uses the primary key values of the 
> >>> >>> just-loaded objects to locate related rows. This style of loading 
> >>> >>> will 
> >>> >>> perform dramatically better than "subquery" eager loading in many 
> >>> >>> cases. 
> >>> >>> 
> >>> >>> * New polymorphic loading options - A new "selectin" loader is 
> also 
> >>> >>> implemented for polymorphic inheritance hierarchies, which will 
> load 
> >>> >>> the extra table rows for subclasses in a result set all at once, 
> >>> >>> without the need to use JOIN or "with_polymorphic". New 
> declarative 
> >>> >>> options are added to allow per-subclass polymorphic loading 
> >>> >>> configuration as well. 
> >>> >>> 
> >>> >>> * The IN operator now emits a simple expression for empty IN - The 
> >>> >>> long standing behavior of "empty in" resolving to a non-performant 
> >>> >>> expression with a warning has been removed as default behavior; 
> for 
> >>> >>> an 
> >>> >>> IN with no elements, a simple 1 != 1 expression is now used to 
> >>> >>> evaluate to "false". 
> >>> >>> 
> >>> >>> * INSERT..ON DUPLICATE KEY UPDATE support in MySQL - complementing 
> >>> >>> the 
> >>> >>> support for PostgreSQL "INSERT..ON CONFLICT" in 1.1, the MySQL 
> >>> >>> dialect 
> >>> >>> now supports the ON DUPLICATE KEY phrase. Simple database-agnostic 
> >>> >>> "merge" routines can now be composed against these two backends. 
> >>> >>> 
> >>> >>> * COMMENT Support - thanks to a generous contribution, version 1.2 
> >>> >>> can 
> >>> >>> emit all necessary DDL as well as fully reflect SQL comments for 
> >>> >>> tables and columns against the MySQL, PostgreSQL, and Oracle 
> >>> >>> backends. 
> >>> >>> 
> >>> >>> * SQL expression caching within ORM loaders - the "lazyload" 
> feature 
> >>> >>> as well as the new "selectin" loading now use SQL expression 
> caching 
> >>> >>> using the "baked query" extension when emitting queries, removing 
> a 
> >>> >>> significant bulk of Python overhead from these very common 
> >>> >>> operations. 
> >>> >>> 
> >>> >>> Users should carefully review the "What's New in SQLAlchemy 1.2? 
> >>> >>> document" [1] as well as the Changelog [2] to note which behaviors 
> >>> >>> and 
> >>> >>> issues are affected. We'd like to thank the many contributors who 
> >>> >>> helped with this release. 
> >>> >>> 
> >>> >>> SQLAlchemy 1.2.0b1 is available on the Download Page [3]. 
> >>> >>> 
> >>> >>> [1] 
> http://docs.sqlalchemy.org/en/latest/changelog/migration_12.html 
> >>> >>> [2] http://www.sqlalchemy.org/changelog/CHANGES_1_2_0b1 
> >>> >>> [3] http://www.sqlalchemy.org/download.html 
> >>> > 
> >>> > -- 
> >>> > SQLAlchemy - 
> >>> > The Python SQL Toolkit and Object Relational Mapper 
> >>> > 
> >>> > http://www.sqlalchemy.org/ 
> >>> > 
> >>> > To post example code, please provide an MCVE: Minimal, Complete, and 
> >>> > Verifiable Example. See http://stackoverflow.com/help/mcve for a 
> full 
> >>> > description. 
> >>> > --- 
> >>> > 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. 
> >>> > To post to this group, send email to sqlal...@googlegroups.com. 
> >>> > Visit this group at https://groups.google.com/group/sqlalchemy. 
> >>> > For more options, visit https://groups.google.com/d/optout. 
> > 
> > -- 
> > SQLAlchemy - 
> > The Python SQL Toolkit and Object Relational Mapper 
> > 
> > http://www.sqlalchemy.org/ 
> > 
> > To post example code, please provide an MCVE: Minimal, Complete, and 
> > Verifiable Example. See http://stackoverflow.com/help/mcve for a full 
> > description. 
> > --- 
> > 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 https://groups.google.com/group/sqlalchemy. 
> > For more options, visit https://groups.google.com/d/optout. 
>

-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
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 https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to