Released: March 10, 2020
[general] [bug] [py3k] Applied an explicit "cause" to most if not all internally raised exceptions
that are raised from within an internal exception catch, to avoid
misleading stacktraces that suggest an error within the handling of an
exception. While it would be preferable to suppress the internally caught
exception in the way that the
there does not as yet seem to be a way to do this without suppressing an
enclosing user constructed context, so for now it exposes the internally
caught exception as the cause so that full information about the context
of the error is maintained.
[orm] [bug] Fixed regression caused in 1.3.13 by #5056 where a refactor of the
ORM path registry system made it such that a path could no longer be
compared to an empty tuple, which can occur in a particular kind of joined
eager loading path. The "empty tuple" use case has been resolved so that
the path registry is compared to a path registry in all cases; the
PathRegistryobject itself now implements
__ne__()methods which will take place for all equality comparisons and
continue to succeed in the not anticipated case that a non-
PathRegistryobject is compared, while emitting a warning that
this object should not be the subject of the comparison.
[orm] [bug] Setting a relationship to viewonly=True which is also the target of a
back_populates or backref configuration will now emit a warning and
eventually be disallowed. back_populates refers specifically to mutation
of an attribute or collection, which is disallowed when the attribute is
subject to viewonly=True. The viewonly attribute is not subject to
persistence behaviors which means it will not reflect correct results
when it is locally mutated.
[orm] [bug] Fixed an additional regression in the same area as that of #5080
introduced in 1.3.0b3 via #4468 where the ability to create a
joined option across a
with_polymorphic()into a relationship
against the base class of that with_polymorphic, and then further into
regular mapped relationships would fail as the base class component would
not add itself to the load path in a way that could be located by the
loader strategy. The changes applied in #5080 have been further
refined to also accommodate this scenario.
[orm] [usecase] Added a new flag
SessionEvents.restore_load_contextwhich apply to the
SessionEvents.loaded_as_persistent()events, which when set will
restore the "load context" of the object after the event hook has been
called. This ensures that the object remains within the "loader context"
of the load operation that is already ongoing, rather than the object being
transferred to a new load context due to refresh operations which may have
occurred in the event. A warning is now emitted when this condition occurs,
which recommends use of the flag to resolve this case. The flag is
"opt-in" so that there is no risk introduced to existing applications.
The change additionally adds support for the
session lifecycle events.
[engine] [bug] Expanded the scope of cursor/connection cleanup when a statement is
executed to include when the result object fails to be constructed, or an
after_cursor_execute() event raises an error, or autocommit / autoclose
fails. This allows the DBAPI cursor to be cleaned up on failure and for
connectionless execution allows the connection to be closed out and
returned to the connection pool, where previously it waiting until garbage
collection would trigger a pool return.
[sql] [bug] [postgresql] Fixed bug where a CTE of an INSERT/UPDATE/DELETE that also uses RETURNING
could then not be SELECTed from directly, as the internal state of the
compiler would try to treat the outer SELECT as a DELETE statement itself
and access nonexistent state.
[postgresql] [bug] Fixed issue where the "schema_translate_map" feature would not work with a
PostgreSQL native enumeration type (i.e.
postgresql.ENUM) in that while the "CREATE TYPE" statement would
be emitted with the correct schema, the schema would not be rendered in
the CREATE TABLE statement at the point at which the enumeration was
[postgresql] [bug] [reflection] Fixed bug where PostgreSQL reflection of CHECK constraints would fail to
parse the constraint if the SQL text contained newline characters. The
regular expression has been adjusted to accommodate for this case. Pull
request courtesy Eric Borczuk.
[mysql] [bug] Fixed issue in MySQL
where using a SQL function or other composed expression for a column argument
would not properly render the
VALUESkeyword surrounding the column
[mssql] [bug] Fixed issue where the
mssql.DATETIMEOFFSETtype would not
accommodate for the
Nonevalue, introduced as part of the series of
fixes for this type first introduced in #4983, #5045.
Additionally, added support for passing a backend-specific date formatted
string through this type, as is typically allowed for date/time types on
most other DBAPIs.
[oracle] [bug] Fixed a reflection bug where table comments could only be retrieved for
tables actually owned by the user but not for tables visible to the user
but owned by someone else. Pull request courtesy Dave Hirschfeld.
[bug] [performance] Revised an internal change to the test system added as a result of
#5085 where a testing-related module per dialect would be loaded
unconditionally upon making use of that dialect, pulling in SQLAlchemy's
testing framework as well as the ORM into the module import space. This
would only impact initial startup time and memory to a modest extent,
however it's best that these additional modules aren't reverse-dependent on
straight Core usage.
[bug] [installation] Vendored the
inspect.formatannotationfunction inside of
sqlalchemy.util.compat, which is needed for the vendored version of
inspect.formatargspec. The function is not documented in cPython and
is not guaranteed to be available in future Python versions.
[ext] [usecase] Added keyword arguments to the
MutableList.sort()function so that a
key function as well as the "reverse" keyword argument can be provided.