>From a quick test, this appears to be special behaviour for the base
class in an inheritance hierarchy. If you extend your test like this:

from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import Query, configure_mappers

Base = declarative_base()

class A1(Base):
    __tablename__ = 'a1'
    id = Column(Integer, primary_key=True)
    poly_on = Column(String, nullable=False)
    __mapper_args__ = {
        'polymorphic_on': poly_on,
        'polymorphic_identity': 'a1',
    }

class A2(A1):
    __mapper_args__ = {
        'polymorphic_identity': 'a2',
    }

class A2a(A2):
    __mapper_args__ = {
        'polymorphic_identity': 'a2a',
    }

class A2b(A2):
    __mapper_args__ = {
        'polymorphic_identity': 'a2b',
    }

if __name__ == '__main__':
    for cls in [A1, A2, A2a, A2b]:
        print('#' * 10)
        print(cls)
        print(Query(cls))


...then the output looks like this:

##########
<class '__main__.A1'>
SELECT a1.id AS a1_id, a1.poly_on AS a1_poly_on
FROM a1
##########
<class '__main__.A2'>
SELECT a1.id AS a1_id, a1.poly_on AS a1_poly_on
FROM a1
WHERE a1.poly_on IN (:poly_on_1, :poly_on_2, :poly_on_3)
##########
<class '__main__.A2a'>
SELECT a1.id AS a1_id, a1.poly_on AS a1_poly_on
FROM a1
WHERE a1.poly_on IN (:poly_on_1)
##########
<class '__main__.A2b'>
SELECT a1.id AS a1_id, a1.poly_on AS a1_poly_on
FROM a1
WHERE a1.poly_on IN (:poly_on_1)


In other words, if you query for A1, you will get every row from the
table, even if the polymorphic identity doesn't match any subclasses.
This makes sense if you think of every row in the table as being some
kind of (possibly specialized) A1.

However, if you query for A2, you will only get rows that are
specifically A2, A2a or A2b.

If you don't want this behaviour, you could probably insert another
class as the parent of A1, with no polymorphic identity. At that
point, I think queries for A1 would include "WHERE poly_on IN ('a1',
'a2')".

Hope that helps,

Simon


On Fri, Jun 21, 2019 at 12:22 PM Dmytro Starosud <d.staro...@gmail.com> wrote:
>
> Base class A1 contains polymorphic_identity (along with polymorphic_on), but 
> Query(A1)doesn't produce where clause, whereas Query(A2) (where A2 is 
> subclass of A1 with its own polymorphic_identity) does.
>
> Tried looking in docs with no success. I think I am just missing something.
>
> from sqlalchemy import Column, Integer, String
> from sqlalchemy.ext.declarative import declarative_base
> from sqlalchemy.orm import Query, configure_mappers
>
> Base = declarative_base()
>
>
> class A1(Base):
>     __tablename__ = 'a1'
>     id = Column(Integer, primary_key=True)
>     poly_on = Column(String, nullable=False)
>     __mapper_args__ = {
>         'polymorphic_on': poly_on,
>         'polymorphic_identity': 'a1',
>     }
>
>
> class A2(A1):
>     __mapper_args__ = {
>         'polymorphic_identity': 'a2',
>     }
>
>
> configure_mappers()
>
> print(Query(A1))
> # SELECT a1.id AS a1_id, a1.poly_on AS a1_poly_on
> # FROM a1
>
> print(Query(A2))
> # SELECT a1.id AS a1_id, a1.poly_on AS a1_poly_on
> # FROM a1
> # WHERE a1.poly_on IN (:poly_on_1)
>
> I would expect WHERE clauses in both cases.
>
>
> Originally posted here.
>
> --
> 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.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/sqlalchemy/941f0c3e-e541-4554-8b4a-570c28afec64%40googlegroups.com.
> 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.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sqlalchemy/CAFHwexe063Gx_%3DicbmyV7ztyXaT857TNMMfW2bg9J6YG%2Bgc4GQ%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to