Oops, missed the Benchling reference in there. Thanks!

On Sunday, June 24, 2018 at 7:09:51 PM UTC-7, Mike Bayer wrote:
>
> other than the imports and missing database setup I had to re-write  ( 
> :) ), great test!   issue is logged at 
>
> https://bitbucket.org/zzzeek/sqlalchemy/issues/4286/mapper_subclass_load_via_in-returns
>  
> where I'll try to figure out a decent way to fix. 
>
> On Sun, Jun 24, 2018 at 6:30 PM,  <vin...@benchling.com <javascript:>> 
> wrote: 
> > Hello! We noticed some weird behavior where our tests were affecting one 
> > another, and I tracked it down to what I believe is a SQLAlchemy bug. It 
> > appears that performing a particular query with a joinedload can alter 
> > future queries that are run without the same joinedload. This appears to 
> > only happen when using 'polymorphic_load': 'selectin' (and not with 
> > 'inline'): 
> > 
> > from benchling import db 
> > 
> > ### Table setup 
> > class Parent(db.Model): 
> >     __tablename__ = 'parent' 
> >     id = db.Column(db.Integer, primary_key=True) 
> > 
> > 
> > class Child(db.Model): 
> >     __tablename__ = 'child' 
> >     id = db.Column(db.Integer, primary_key=True) 
> >     parent_id = db.Column(db.Integer, db.ForeignKey('parent.id')) 
> >     parent = db.relationship('Parent', backref=db.backref('children')) 
> > 
> >     type = db.Column(db.String(), nullable=False) 
> >     __mapper_args__ = { 
> >         'polymorphic_on': type, 
> >     } 
> > 
> > class ChildSubclass1(Child): 
> >     __tablename__ = 'child_subclass1' 
> >     id = db.Column(db.Integer, db.ForeignKey('child.id'), 
> primary_key=True) 
> >     __mapper_args__ = {'polymorphic_identity': 'subclass1', 
> > 'polymorphic_load': 'selectin'} 
> > 
> > 
> > class Other(db.Model): 
> >     id = db.Column(db.Integer, primary_key=True) 
> >     child_subclass_id = db.Column(db.Integer, 
> > db.ForeignKey('child_subclass1.id')) 
> >     child_subclass = db.relationship('ChildSubclass1', 
> > backref=db.backref('others')) 
> > 
> > Parent.__table__.create(bind=db.engine) 
> > Child.__table__.create(bind=db.engine) 
> > ChildSubclass1.__table__.create(bind=db.engine) 
> > Other.__table__.create(bind=db.engine) 
> > 
> > 
> > def is_other_in_session(): 
> >     return any(isinstance(model, Other) for model in db.session) 
> > 
> > 
> > ### Bug repro: 
> > parent = Parent() 
> > subclass1 = ChildSubclass1(parent=parent) 
> > other = Other(child_subclass=subclass1) 
> > db.session.add_all([parent, subclass1, other]) 
> > db.session.commit() 
> > 
> > 
> > # Test 1: Loading Parent + Children does not load Other 
> > print '\nTest #1: Loading Parent + Children does not load others' 
> > db.session.expunge_all() 
> > assert not is_other_in_session() 
> > parents = 
> > 
> Parent.query.options(db.joinedload(Parent.children.of_type(ChildSubclass1))).all()
>  
>
> > assert not is_other_in_session() 
> > 
> > print '\nTest #2: Loading Parent + Children + Others loads others as 
> > expected' 
> > db.session.expunge_all() 
> > assert not is_other_in_session() 
> > parents = 
> > 
> Parent.query.options(db.joinedload(Parent.children.of_type(ChildSubclass1)).joinedload(ChildSubclass1.others)).all()
>  
>
> > assert is_other_in_session() 
> > 
> > print '\nTest #3: Loading Parent + Children should not load others, but 
> it 
> > does now' 
> > db.session.expunge_all() 
> > assert not is_other_in_session() 
> > parents = 
> > 
> Parent.query.options(db.joinedload(Parent.children.of_type(ChildSubclass1))).all()
>  
>
> > assert not is_other_in_session(), 'The above query should not load any 
> > Others!' 
> > 
> > Test #1 and Test #3 are identical, but Test #3 fails because it is run 
> after 
> > Test #2 (which does a joinedload on ChildSubclass.others). I thought 
> this 
> > might be related to baked queries, but it still fails with 
> > enable_baked_queries=False . Let me know if there's any other 
> information I 
> > can provide that would be useful, or if there are any workarounds we can 
> use 
> > right now! 
> > 
> > -- 
> > 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