found a few mentions of "flat=True" that fail to specify that this flag should **not** be used when selectable= is set, pushing extra verbiage to that effect now. most likely with_polymorphic() should raise an error if both flags are set.
On Wed, Mar 7, 2018 at 3:48 PM, Mike Bayer <mike...@zzzcomputing.com> wrote: > here's a full MCVE, which with "flat=True" reproduces your issue > exactly (send me this next time). The issue is the "flat=True", take > that out because it isn't compatible with a concrete union - it > implies the "aliased" flag and that gets in the way of what the > polymorphic_union() function is doing already. > > > from sqlalchemy import * > from sqlalchemy.orm import * > from sqlalchemy.ext.declarative import declarative_base > from sqlalchemy.ext.declarative import declared_attr > from sqlalchemy.ext.declarative import AbstractConcreteBase > > Base = declarative_base() > > > class OrderItem(AbstractConcreteBase, Base): > pass > > > class OrderTestItem(OrderItem): > __tablename__ = 'order_test_item' > > order_id = Column(Integer, ForeignKey("order.id"), primary_key=True) > test_id = Column(Integer, ForeignKey("test.id"), primary_key=True) > > test = relationship('Test') > order = relationship('Order') > > __mapper_args__ = { > 'polymorphic_identity': 'order_test_item', > 'concrete': True > } > > > class User(Base): > __tablename__ = 'user' > id = Column(Integer, primary_key=True) > > > class Test(Base): > __tablename__ = 'test' > id = Column(Integer, primary_key=True) > > > class Order(Base): > __tablename__ = 'order' > > id = Column(Integer, primary_key=True) > > user_id = Column(Integer, ForeignKey('user.id')) > > user = relationship('User') > items = relationship('OrderItem') > > e = create_engine("sqlite://", echo=True) > Base.metadata.create_all(e) > > s = Session(e) > > t1, t2 = Test(), Test() > s.add(Order(items=[OrderTestItem(test=t1), OrderTestItem(test=t2)])) > s.commit() > > > pjoin = polymorphic_union({ > 'order_test_item': OrderTestItem.__table__, > }, 'type', 'pjoin') > > order_items = with_polymorphic( > OrderItem, [OrderTestItem], selectable=pjoin) > > > s = Session(e) > order = s.query(Order).join(Order.items.of_type(order_items)).all() > > > > > On Wed, Mar 7, 2018 at 3:36 PM, Harshvardhan Gupta > <harshsay...@gmail.com> wrote: >> Thanks for replying. >> I forgot to show the error. >> It is this: >> >> 1054, "Unknown column 'pjoin.order_id' in 'on clause'") [SQL: "SELECT >> `order`.id AS order_id, `order`.rp_id AS order_rp_id, `order`.user_id AS >> order_user_id \nFROM `order` INNER JOIN (SELECT order_test_item.order_id AS >> order_id, order_test_item.test_id AS test_id, 'order_test_item' AS type >> \nFROM order_test_item) AS anon_1 ON `order`.id = pjoin.order_id" >> >> >> >> >> On Wednesday, 7 March 2018 15:28:54 UTC-5, Mike Bayer wrote: >>> >>> On Tue, Mar 6, 2018 at 8:36 PM, Harshvardhan Gupta >>> <harsh...@gmail.com> wrote: >>> > I tried to use AbstractConcreteBase for polymorphic relationships , but >>> > I am >>> > getting errors. The examples in sqlalchemy cover normal polymorphism >>> > well, >>> > but not those with Abstract Base classes. >>> > >>> > >>> > I have already asked a question on stack overflow . >>> > >>> > The gist of the question is: >>> > >>> > class OrderItem(Dictifiable, AbstractConcreteBase, db.Model): >>> > pass >>> > >>> > >>> > class OrderTestItem(OrderItem): >>> > order_id = Column(Integer, ForeignKey("order.id"), primary_key=True) >>> > test_id = Column(Integer, ForeignKey("test.id"), primary_key=True) >>> > >>> > test = relationship('Test') >>> > order = relationship('Order') >>> > >>> > __mapper_args__ = { >>> > 'polymorphic_identity': 'order_test_item', >>> > 'concrete': True >>> > } >>> > >>> > >>> > >>> > class Order(Dictifiable, db.Model): # This class has a relation to the >>> > polymorphic class >>> > >>> > id = Column(Integer, Sequence('user_id_seq'), primary_key=True) >>> > >>> > user_id = Column(Integer, ForeignKey('user.id')) >>> > >>> > user = relationship('User') >>> > items = relationship('OrderItem') >>> > >>> > >>> > I query like : >>> > >>> > pjoin = polymorphic_union({ >>> > 'order_test_item': OrderTestItem.__table__, >>> > }, 'type', 'pjoin') >>> > >>> > order_items = >>> > with_polymorphic(OrderItem,[OrderTestItem],selectable=pjoin,flat=True) >>> > >>> > And my actual query : >>> > >>> > order = Order.query.join(Order.items.of_type(order_items)).all() >>> > >>> > >>> > I would like to know what the correct way to query these tables is, how >>> > to >>> > eager load polymorphic tables, and how to filter on the relationships. >>> >>> looks correct to me. what is "the error" ? can you provide full >>> MCVE + complete stack trace? >>> >>> >>> >>> > >>> > I plan to send a pull request with an example of these test cases after >>> > I >>> > know the answers myself. >>> > >>> > >>> > -- >>> > 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. -- 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.