diff options
| -rw-r--r-- | doc/build/changelog/unreleased_13/5196.rst | 8 | ||||
| -rw-r--r-- | lib/sqlalchemy/orm/session.py | 2 | ||||
| -rw-r--r-- | test/orm/test_session.py | 23 |
3 files changed, 32 insertions, 1 deletions
diff --git a/doc/build/changelog/unreleased_13/5196.rst b/doc/build/changelog/unreleased_13/5196.rst new file mode 100644 index 000000000..3183164a7 --- /dev/null +++ b/doc/build/changelog/unreleased_13/5196.rst @@ -0,0 +1,8 @@ +.. change:: + :tags: orm, bug + :tickets: 5196 + + Fixed regression in 1.3.14 due to :ticket:`4849` where a sys.exc_info() + call failed to be invoked correctly when a flush error would occur. Test + coverage has been added for this exception case. + diff --git a/lib/sqlalchemy/orm/session.py b/lib/sqlalchemy/orm/session.py index b542f0506..f172649ba 100644 --- a/lib/sqlalchemy/orm/session.py +++ b/lib/sqlalchemy/orm/session.py @@ -1661,7 +1661,7 @@ class Session(_SessionClassMethods): "consider using a session.no_autoflush block if this " "flush is occurring prematurely" ) - util.raise_(e, with_traceback=sys.exc_info[2]) + util.raise_(e, with_traceback=sys.exc_info()[2]) def refresh( self, diff --git a/test/orm/test_session.py b/test/orm/test_session.py index a2f0a9aa1..fa68fedfe 100644 --- a/test/orm/test_session.py +++ b/test/orm/test_session.py @@ -449,6 +449,29 @@ class SessionStateTest(_fixtures.FixtureTest): is_true(sess.autoflush) + def test_autoflush_exception_addition(self): + User, users = self.classes.User, self.tables.users + Address, addresses = self.classes.Address, self.tables.addresses + mapper(User, users, properties={"addresses": relationship(Address)}) + mapper(Address, addresses) + + s = Session(testing.db) + + u1 = User(name="first") + + s.add(u1) + s.commit() + + u1.addresses.append(Address(email=None)) + + # will raise for null email address + assert_raises_message( + sa.exc.DBAPIError, + ".*raised as a result of Query-invoked autoflush; consider using " + "a session.no_autoflush block.*", + s.query(User).first, + ) + def test_deleted_flag(self): users, User = self.tables.users, self.classes.User |
