[Sqlalchemy-tickets] Issue #3844: passive_deletes='all' is not complete (zzzeek/sqlalchemy)
Brought to you by:
zzzeek
From: Michael B. <iss...@bi...> - 2016-11-05 21:20:07
|
New issue 3844: passive_deletes='all' is not complete https://bitbucket.org/zzzeek/sqlalchemy/issues/3844/passive_deletes-all-is-not-complete Michael Bayer: Probably has to wait until 1.2 because this is a behavior change, but passive_deletes is not skipping setting the FK to NULL in all cases: ``` #!python from sqlalchemy import Column, Integer, String, ForeignKey, Boolean from sqlalchemy import create_engine, and_ from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relationship from sqlalchemy.orm import sessionmaker from sqlalchemy import event from sqlalchemy import inspect Base = declarative_base() engine = create_engine('sqlite:///:memory:', echo=True) Session = sessionmaker(bind=engine) class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) address = relationship( "Address", uselist=False, passive_deletes="all") class Address(Base): __tablename__ = 'addresses' id = Column(Integer, primary_key=True) email = Column(String, nullable=False) deleted = Column(Boolean, nullable=False, default=False) user_id = Column(Integer, ForeignKey('users.id')) user = relationship("User") Base.metadata.create_all(engine) sess = Session() a1 = Address(email='foo') u = User(id=1, address=a1) sess.add_all([u, a1]) sess.commit() u.address = Address(email='bar') sess.commit() assert a1.user_id == 1, a1.user_id ``` because we have a sync to None not checking it, needs this: ``` #!diff diff --git a/lib/sqlalchemy/orm/dependency.py b/lib/sqlalchemy/orm/dependency.py index a3e5b12..f2193b6 100644 --- a/lib/sqlalchemy/orm/dependency.py +++ b/lib/sqlalchemy/orm/dependency.py @@ -553,7 +553,8 @@ class OneToManyDP(DependencyProcessor): for child in history.deleted: if not self.cascade.delete_orphan and \ - not self.hasparent(child): + not self.hasparent(child) and \ + not self.passive_deletes == 'all': self._synchronize(state, child, None, True, uowcommit, False) ``` check if this bug is a dupe b.c. this seems kind of obvious, also check for any other synchronize(.. None) that is being allowed. review the docs for passive_deletes to make sure I'm not misunderstanding the intent. making this critical so it remains noticed. |