flush error suppressed when rollback fails

Issue #3535 duplicate
Mike Bayer repo owner created an issue

despite all the "Safe reraise" and everything, I'm still not seeing the original cause here when I illustrate a variant of #3532:

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

Comments (2)

  1. Mike Bayer reporter

    its directly a dupe. under py3k we see both exceptions fine. but this is not working in py2k.

  2. Log in to comment