]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commit
Support result.close() for all iterator patterns
authorMike Bayer <mike_mp@zzzcomputing.com>
Tue, 25 Oct 2022 13:10:09 +0000 (09:10 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Thu, 3 Nov 2022 22:42:52 +0000 (18:42 -0400)
commitb96321ae79a0366c33ca739e6e67aaf5f4420db4
treed56cb4cdf58e0b060f1ceb14f468eef21de0688b
parent9bae9a931a460ff70172858ff90bcc1defae8e20
Support result.close() for all iterator patterns

This change contains new features for 2.0 only as well as some
behaviors that will be backported to 1.4.

For 1.4 and 2.0:

Fixed issue where the underlying DBAPI cursor would not be closed when
using :class:`_orm.Query` with :meth:`_orm.Query.yield_per` and direct
iteration, if a user-defined exception case were raised within the
iteration process, interrupting the iterator. This would lead to the usual
MySQL-related issues with server side cursors out of sync.

For 1.4 only:

A similar scenario can occur when using :term:`2.x` executions with direct
use of :class:`.Result`, in that case the end-user code has access to the
:class:`.Result` itself and should call :meth:`.Result.close` directly.
Version 2.0 will feature context-manager calling patterns to address this
use case.  However within the 1.4 scope, ensured that ``.close()`` methods
are available on all :class:`.Result` implementations including
:class:`.ScalarResult`, :class:`.MappingResult`.

For 2.0 only:

To better support the use case of iterating :class:`.Result` and
:class:`.AsyncResult` objects where user-defined exceptions may interrupt
the iteration, both objects as well as variants such as
:class:`.ScalarResult`, :class:`.MappingResult`,
:class:`.AsyncScalarResult`, :class:`.AsyncMappingResult` now support
context manager usage, where the result will be closed at the end of
iteration.

Corrected various typing issues within the engine and async engine
packages.

Fixes: #8710
Change-Id: I3166328bfd3900957eb33cbf1061d0495c9df670
18 files changed:
doc/build/changelog/unreleased_14/8710.rst [new file with mode: 0644]
doc/build/changelog/unreleased_20/8710.rst [new file with mode: 0644]
doc/build/changelog/whatsnew_20.rst
doc/build/core/connections.rst
lib/sqlalchemy/engine/result.py
lib/sqlalchemy/ext/asyncio/base.py
lib/sqlalchemy/ext/asyncio/engine.py
lib/sqlalchemy/ext/asyncio/result.py
lib/sqlalchemy/ext/asyncio/session.py
lib/sqlalchemy/orm/query.py
lib/sqlalchemy/util/__init__.py
lib/sqlalchemy/util/compat.py
test/base/test_result.py
test/ext/asyncio/test_engine_py3k.py
test/ext/mypy/plain_files/engines.py [new file with mode: 0644]
test/orm/test_loading.py
test/orm/test_query.py
test/sql/test_resultset.py