[Sqlalchemy-tickets] Issue #3535: flush error suppressed when rollback fails (zzzeek/sqlalchemy)
Brought to you by:
zzzeek
|
From: Mike B. <iss...@bi...> - 2015-09-17 14:44:47
|
New issue 3535: flush error suppressed when rollback fails https://bitbucket.org/zzzeek/sqlalchemy/issues/3535/flush-error-suppressed-when-rollback-fails Mike Bayer: despite all the "Safe reraise" and everything, I'm still not seeing the original cause here when I illustrate a variant of #3532: ``` #!python from sqlalchemy import * from sqlalchemy.orm import * from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class A(Base): __tablename__ = 'a' id = Column(Integer, primary_key=True) bs = relationship("B") class B(Base): __tablename__ = 'b' id = Column(Integer, primary_key=True) a_id = Column(ForeignKey('a.id'), nullable=False) class C(Base): __tablename__ = 'c' id = Column(Integer, primary_key=True) a_id = Column(ForeignKey('a.id')) a1 = relationship("A") a2 = a1 e = create_engine("sqlite://", echo=True) Base.metadata.create_all(e) s = Session(e) s.add(C()) s.commit() c1 = s.query(C).first() s.add(B()) s.query(A).get(1) ``` ``` #! 2015-09-17 10:42:02,198 INFO sqlalchemy.engine.base.Engine ROLLBACK Traceback (most recent call last): File "test.py", line 37, in <module> s.query(A).get(1) File "/Users/classic/dev/sqlalchemy/lib/sqlalchemy/orm/query.py", line 831, in get return self._get_impl(ident, loading.load_on_ident) File "/Users/classic/dev/sqlalchemy/lib/sqlalchemy/orm/query.py", line 864, in _get_impl return fallback_fn(self, key) File "/Users/classic/dev/sqlalchemy/lib/sqlalchemy/orm/loading.py", line 223, in load_on_ident return q.one() File "/Users/classic/dev/sqlalchemy/lib/sqlalchemy/orm/query.py", line 2498, in one ret = list(self) File "/Users/classic/dev/sqlalchemy/lib/sqlalchemy/orm/query.py", line 2540, in __iter__ self.session._autoflush() File "/Users/classic/dev/sqlalchemy/lib/sqlalchemy/orm/session.py", line 1283, in _autoflush self.flush() File "/Users/classic/dev/sqlalchemy/lib/sqlalchemy/orm/session.py", line 2024, in flush self._flush(objects) File "/Users/classic/dev/sqlalchemy/lib/sqlalchemy/orm/session.py", line 2142, in _flush transaction.rollback(_capture_exception=True) File "/Users/classic/dev/sqlalchemy/lib/sqlalchemy/util/langhelpers.py", line 63, in __exit__ compat.reraise(type_, value, traceback) File "/Users/classic/dev/sqlalchemy/lib/sqlalchemy/orm/session.py", line 2142, in _flush transaction.rollback(_capture_exception=True) File "/Users/classic/dev/sqlalchemy/lib/sqlalchemy/orm/session.py", line 415, in rollback transaction._rollback_impl() File "/Users/classic/dev/sqlalchemy/lib/sqlalchemy/orm/session.py", line 448, in _rollback_impl self._restore_snapshot(dirty_only=self.nested) File "/Users/classic/dev/sqlalchemy/lib/sqlalchemy/orm/session.py", line 290, in _restore_snapshot s._expire(s.dict, self.session.identity_map._modified) File "/Users/classic/dev/sqlalchemy/lib/sqlalchemy/orm/state.py", line 523, in _expire [impl.key for impl in self.manager._scalar_loader_impls File "/Users/classic/dev/sqlalchemy/lib/sqlalchemy/util/langhelpers.py", line 747, in __get__ obj.__dict__[self.__name__] = result = self.fget(obj) File "/Users/classic/dev/sqlalchemy/lib/sqlalchemy/orm/instrumentation.py", line 111, in _scalar_loader_impls self.values() if attr.impl.accepts_scalar_loader]) AttributeError: 'NoneType' object has no attribute 'accepts_scalar_loader' ``` between this and that we're seeing #2696 variants come up in openstack we need to squash these rollback-related errors once and for all |