Doh that's exactly what I need. Need to read through the docs again, I missed that parameter.
Thanks! On Monday, August 6, 2018 at 4:46:57 PM UTC-5, Mike Bayer wrote: > > On Mon, Aug 6, 2018 at 4:14 PM, Derek Lambert <dlam...@dereklambert.com > <javascript:>> wrote: > > I do want it to tell me when stuff is being eager loaded so I can > optimize > > those queries. > > > > SQLAlchemy shouldn't need to know about the other end of the > relationship to > > delete the person should it? > > > > I didn't notice this before, but when I add passive_deletes=True on the > > "many" side I get the warning: > > > > SAWarning: On Person.category, 'passive_deletes' is normally configured > on > > one-to-many, one-to-one, many-to-many relationships only. > > > > If I move the passive_deletes to the "one" side I get the exception > again. > > the lazy load here doesn't need to actually fire off so just limit > your raiseload to sql only: > > orm.raiseload('*', sql_only=True) > > test script passes > > > > > > > > On Friday, August 3, 2018 at 2:29:45 PM UTC-5, Derek Lambert wrote: > >> > >> When deleting a child object in a one-to-many relationship retrieved > with > >> the raiseload('*') query option an exception is raised. Adding > >> passive_deletes=True to the relationship on the child prevents the > >> exception, but that seems like a hack. > >> > >> I can remove the option from the query, but I'm trying to understand > the > >> behavior here. Is this expected? > >> > >> > >> import sqlalchemy as sa > >> import sqlalchemy.orm as orm > >> from sqlalchemy.ext.declarative import declarative_base > >> > >> > >> Base = declarative_base() > >> > >> > >> class Person(Base): > >> id = sa.Column(sa.Integer, autoincrement=True, > >> primary_key=True) > >> category_id = sa.Column(sa.Integer, sa.ForeignKey('category.id'), > >> nullable=False) > >> name = sa.Column(sa.String) > >> > >> category = orm.relationship('Category', > back_populates='persons', > >> innerjoin=True) > >> > >> __tablename__ = 'person' > >> > >> > >> class Category(Base): > >> id = sa.Column(sa.Integer, autoincrement=True, primary_key=True) > >> name = sa.Column(sa.String, unique=True) > >> > >> persons = orm.relationship('Person', back_populates='category') > >> > >> __tablename__ = 'category' > >> > >> > >> engine_url = 'postgresql+psycopg2://postgres@localhost/test_test' > >> engine = sa.create_engine(engine_url, echo=True) > >> > >> engine.execute('DROP TABLE IF EXISTS "person"') > >> engine.execute('DROP TABLE IF EXISTS "category"') > >> > >> Base.metadata.create_all(engine) > >> > >> session = orm.sessionmaker(bind=engine)() > >> category1 = Category(name='Category1') > >> session.add(category1) > >> session.commit() > >> session.flush() > >> > >> person = Person(category=category1, name='Some guy') > >> session.add(person) > >> session.commit() > >> session.flush() > >> > >> session.expunge_all() > >> > >> person = session.query(Person).filter(Person.name == 'Some > >> guy').options(orm.raiseload('*')).one() > >> > >> session.delete(person) > >> session.commit() > >> > >> This raises: > >> > >> Traceback (most recent call last): > >> File "/Users/dereklambert/Development/test/misc/test_raise_load.py", > >> line 52, in <module> > >> session.commit() > >> File > >> > "/Users/dereklambert/Development/test/venv/lib/python3.6/site-packages/sqlalchemy/orm/session.py", > > > >> line 943, in commit > >> self.transaction.commit() > >> File > >> > "/Users/dereklambert/Development/test/venv/lib/python3.6/site-packages/sqlalchemy/orm/session.py", > > > >> line 467, in commit > >> self._prepare_impl() > >> File > >> > "/Users/dereklambert/Development/test/venv/lib/python3.6/site-packages/sqlalchemy/orm/session.py", > > > >> line 447, in _prepare_impl > >> self.session.flush() > >> File > >> > "/Users/dereklambert/Development/test/venv/lib/python3.6/site-packages/sqlalchemy/orm/session.py", > > > >> line 2254, in flush > >> self._flush(objects) > >> File > >> > "/Users/dereklambert/Development/test/venv/lib/python3.6/site-packages/sqlalchemy/orm/session.py", > > > >> line 2380, in _flush > >> transaction.rollback(_capture_exception=True) > >> File > >> > "/Users/dereklambert/Development/test/venv/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py", > > > >> line 66, in __exit__ > >> compat.reraise(exc_type, exc_value, exc_tb) > >> File > >> > "/Users/dereklambert/Development/test/venv/lib/python3.6/site-packages/sqlalchemy/util/compat.py", > > > >> line 249, in reraise > >> raise value > >> File > >> > "/Users/dereklambert/Development/test/venv/lib/python3.6/site-packages/sqlalchemy/orm/session.py", > > > >> line 2344, in _flush > >> flush_context.execute() > >> File > >> > "/Users/dereklambert/Development/test/venv/lib/python3.6/site-packages/sqlalchemy/orm/unitofwork.py", > > > >> line 370, in execute > >> postsort_actions = self._generate_actions() > >> File > >> > "/Users/dereklambert/Development/test/venv/lib/python3.6/site-packages/sqlalchemy/orm/unitofwork.py", > > > >> line 329, in _generate_actions > >> if action.execute(self): > >> File > >> > "/Users/dereklambert/Development/test/venv/lib/python3.6/site-packages/sqlalchemy/orm/unitofwork.py", > > > >> line 463, in execute > >> prop_has_changes(uow, delete_states, True) or > >> File > >> > "/Users/dereklambert/Development/test/venv/lib/python3.6/site-packages/sqlalchemy/orm/dependency.py", > > > >> line 234, in prop_has_changes > >> passive) > >> File > >> > "/Users/dereklambert/Development/test/venv/lib/python3.6/site-packages/sqlalchemy/orm/unitofwork.py", > > > >> line 225, in get_attribute_history > >> attributes.LOAD_AGAINST_COMMITTED) > >> File > >> > "/Users/dereklambert/Development/test/venv/lib/python3.6/site-packages/sqlalchemy/orm/attributes.py", > > > >> line 753, in get_history > >> current = self.get(state, dict_, passive=passive) > >> File > >> > "/Users/dereklambert/Development/test/venv/lib/python3.6/site-packages/sqlalchemy/orm/attributes.py", > > > >> line 597, in get > >> value = callable_(state, passive) > >> File > >> > "/Users/dereklambert/Development/test/venv/lib/python3.6/site-packages/sqlalchemy/orm/strategies.py", > > > >> line 834, in __call__ > >> return strategy._load_for_state(state, passive) > >> File > >> > "/Users/dereklambert/Development/test/venv/lib/python3.6/site-packages/sqlalchemy/orm/strategies.py", > > > >> line 589, in _load_for_state > >> self._invoke_raise_load(state, passive, "raise") > >> File > >> > "/Users/dereklambert/Development/test/venv/lib/python3.6/site-packages/sqlalchemy/orm/strategies.py", > > > >> line 564, in _invoke_raise_load > >> "'%s' is not available due to lazy='%s'" % (self, lazy) > >> sqlalchemy.exc.InvalidRequestError: 'Person.category' is not available > due > >> to lazy='raise' > >> > > -- > > 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.