2.0.24
2.0.24
Released: December 28, 2023
orm
-
[orm] [bug] Improved a fix first implemented for #3208 released in version
0.9.8, where the registry of classes used internally by declarative could
be subject to a race condition in the case where individual mapped classes
are being garbage collected at the same time while new mapped classes are
being constructed, as can happen in some test suite configurations or
dynamic class creation environments. In addition to the weakref check
already added, the list of items being iterated is also copied first to
avoid "list changed while iterating" errors. Pull request courtesy Yilei
Yang.This change is also backported to: 1.4.51
References: #10782
-
[orm] [bug] Fixed issue where use of
_orm.foreign()
annotation on a
non-initialized_orm.mapped_column()
construct would produce an
expression without a type, which was then not updated at initialization
time of the actual column, leading to issues such as relationships not
determininguse_get
appropriately.References: #10597
-
[orm] [bug] Improved the error message produced when the unit of work process sets the
value of a primary key column to NULL due to a related object with a
dependency rule on that column being deleted, to include not just the
destination object and column name but also the source column from which
the NULL value is originating. Pull request courtesy Jan Vollmer.References: #10668
-
[orm] [bug] Modified the
__init_subclass__()
method used by
_orm.MappedAsDataclass
,_orm.DeclarativeBase
and
_orm.DeclarativeBaseNoMeta
to accept arbitrary**kw
and to
propagate them to thesuper()
call, allowing greater flexibility in
arranging custom superclasses and mixins which make use of
__init_subclass__()
keyword arguments. Pull request courtesy Michael
Oliver.References: #10732
-
[orm] [bug] Ensured the use case of
Bundle
objects used in the
returning()
portion of ORM-enabled INSERT, UPDATE and DELETE statements
is tested and works fully. This was never explicitly implemented or
tested previously and did not work correctly in the 1.4 series; in the 2.0
series, ORM UPDATE/DELETE with WHERE criteria was missing an implementation
method preventingBundle
objects from working.References: #10776
-
[orm] [bug] Fixed 2.0 regression in
MutableList
where a routine that detects
sequences would not correctly filter out string or bytes instances, making
it impossible to assign a string value to a specific index (while
non-sequence values would work fine).References: #10784
engine
-
[engine] [bug] Fixed URL-encoding of the username and password components of
engine.URL
objects when converting them to string using the
_engine.URL.render_as_string()
method, by using Python standard
libraryurllib.parse.quote
while allowing for plus signs and spaces to
remain unchanged as supported by SQLAlchemy's non-standard URL parsing,
rather than the legacy home-grown routine from many years ago. Pull request
courtesy of Xavier NUNN.References: #10662
sql
-
[sql] [bug] Fixed issue in stringify for SQL elements, where a specific dialect is not
passed, where a dialect-specific element such as the PostgreSQL "on
conflict do update" construct is encountered and then fails to provide for
a stringify dialect with the appropriate state to render the construct,
leading to internal errors.References: #10753
-
[sql] [bug] Fixed issue where stringifying or compiling a
CTE
that was
against a DML construct such as an_sql.insert()
construct would fail
to stringify, due to a mis-detection that the statement overall is an
INSERT, leading to internal errors.
schema
-
[schema] [bug] Fixed issue where error reporting for unexpected schema item when creating
objects like_schema.Table
would incorrectly handle an argument
that was itself passed as a tuple, leading to a formatting error. The
error message has been modernized to use f-strings.References: #10654
typing
-
[typing] [bug] Completed pep-484 typing for the
sqlalchemy.sql.functions
module.
_sql.select()
constructs made againstfunc
elements should now
have filled-in return types.References: #6810
asyncio
- [asyncio] [change] The
async_fallback
dialect argument is now deprecated, and will be
removed in SQLAlchemy 2.1. This flag has not been used for SQLAlchemy's
test suite for some time. asyncio dialects can still run in a synchronous
style by running code within a greenlet using_util.greenlet_spawn()
.
postgresql
-
[postgresql] [bug] Adjusted the asyncpg dialect such that when the
terminate()
method is
used to discard an invalidated connection, the dialect will first attempt
to gracefully close the connection using.close()
with a timeout, if
the operation is proceeding within an async event loop context only. This
allows the asyncpg driver to attend to finalizing aTimeoutError
including being able to close a long-running query server side, which
otherwise can keep running after the program has exited.References: #10717
mysql
-
[mysql] [bug] Fixed regression introduced by the fix in ticket #10492 when using
pool pre-ping with PyMySQL version older than 1.0.This change is also backported to: 1.4.51
References: #10650
-
[mysql] [bug] Fixed regression introduced by the fix in ticket #10492 when using
pool pre-ping with PyMySQL version older than 1.0.This change is also backported to: 1.4.51
References: #10650
tests
-
[tests] [bug] Improvements to the test suite to further harden its ability to run
when Pythongreenlet
is not installed. There is now a tox
target that includes the token "nogreenlet" that will run the suite
with greenlet not installed (note that it still temporarily installs
greenlet as part of the tox config, however).References: #10747