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 > <https://groups.google.com/forum/#!topic/sqlalchemy/AE8-myRUZp0>), 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+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.