Thanks for your reply!

> you could probably insert another class as the parent of A1, with no 
polymorphic identity.

This is what I would like to avoid. Otherwise I would need to write some 
metaclass machinery to inject base class for all hundred models I have.
Originally I am going to add this __mapper_args__ via mixin with 
declared_attr.

пʼятниця, 21 червня 2019 р. 15:08:47 UTC+3 користувач Simon King написав:
>
> 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.st...@gmail.com 
> <javascript:>> 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 sqlal...@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. 
> > 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/37e43d97-94ec-4669-9147-4568545186a4%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to