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+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