return self
def __exit__(self, type_, value, traceback):
- self._proxied_transaction.__exit__(type_, value, traceback)
- self.migration_context._transaction = None
+ if self._proxied_transaction is not None:
+ self._proxied_transaction.__exit__(type_, value, traceback)
+ self.migration_context._transaction = None
class MigrationContext(object):
--- /dev/null
+.. change::
+ :tags: bug, environment
+ :tickets: 829
+
+ Fixed regression caused by the SQLAlchemy 1.4/2.0 compatibility switch
+ where calling ``.rollback()`` or ``.commit()`` explicitly within the
+ ``context.begin_transaction()`` context manager would cause it to fail when
+ the block ended, as it did not expect that the transaction was manually
+ closed.
assert_raises(Exception, go)
is_false(self.conn.in_transaction())
+ def test_proxy_transaction_contextmanager_explicit_rollback(self):
+ context = self._fixture(
+ {"transaction_per_migration": True, "transactional_ddl": True}
+ )
+ proxy = context.begin_transaction(_per_migration=True)
+ is_true(self.conn.in_transaction())
+
+ with proxy:
+ is_true(self.conn.in_transaction())
+ proxy.rollback()
+ is_false(self.conn.in_transaction())
+
+ is_false(self.conn.in_transaction())
+
+ def test_proxy_transaction_contextmanager_explicit_commit(self):
+ context = self._fixture(
+ {"transaction_per_migration": True, "transactional_ddl": True}
+ )
+ proxy = context.begin_transaction(_per_migration=True)
+ is_true(self.conn.in_transaction())
+
+ with proxy:
+ is_true(self.conn.in_transaction())
+ proxy.commit()
+ is_false(self.conn.in_transaction())
+
+ is_false(self.conn.in_transaction())
+
def test_transaction_per_migration_transactional_ddl(self):
context = self._fixture(
{"transaction_per_migration": True, "transactional_ddl": True}