1.4.1
Released: March 17, 2021
orm
-
[orm] [bug] [regression] Fixed regression where producing a Core expression construct such as
_sql.select()
using ORM entities would eagerly configure the mappers,
in an effort to maintain compatibility with the_orm.Query
object
which necessarily does this to support many backref-related legacy cases.
However, core_sql.select()
constructs are also used in mapper
configurations and such, and to that degree this eager configuration is
more of an inconvenience, so eager configure has been disabled for the
_sql.select()
and other Core constructs in the absence of ORM loading
types of functions such as_orm.Load
.The change maintains the behavior of
_orm.Query
so that backwards
compatibility is maintained. However, when using a_sql.select()
in
conjunction with ORM entities, a "backref" that isn't explicitly placed on
one of the classes until mapper configure time won't be available unless
_orm.configure_mappers()
or the newer_orm.registry.configure()
has been called elsewhere. Prefer using
_orm.relationship.back_populates
for more explicit relationship
configuration which does not have the eager configure requirement.References: #6066
-
[orm] [bug] [regression] Fixed a critical regression in the relationship lazy loader where the SQL
criteria used to fetch a related many-to-one object could go stale in
relation to other memoized structures within the loader if the mapper had
configuration changes, such as can occur when mappers are late configured
or configured on demand, producing a comparison to None and returning no
object. Huge thanks to Alan Hamlett for their help tracking this down late
into the night.References: #6055
-
[orm] [bug] [regression] Fixed regression where the
_orm.Query.exists()
method would fail to
create an expression if the entity list of the_orm.Query
were
an arbitrary SQL column expression.References: #6076
-
[orm] [bug] [regression] Fixed regression where calling upon
_orm.Query.count()
in conjunction
with a loader option such as_orm.joinedload()
would fail to ignore
the loader option. This is a behavior that has always been very specific to
the_orm.Query.count()
method; an error is normally raised if a given
_orm.Query
has options that don't apply to what it is returning.References: #6052
-
[orm] [bug] [regression] Fixed regression in
_orm.Session.identity_key()
, including that the
method and related methods were not covered by any unit test as well as
that the method contained a typo preventing it from functioning correctly.References: #6067
orm declarative
-
[orm] [declarative] [bug] [regression] Fixed bug where user-mapped classes that contained an attribute named
"registry" would cause conflicts with the new registry-based mapping system
when usingDeclarativeMeta
. While the attribute remains
something that can be set explicitly on a declarative base to be
consumed by the metaclass, once located it is placed under a private
class variable so it does not conflict with future subclasses that use
the same name for other purposes.References: #6054
engine
-
[engine] [bug] [regression] The Python
namedtuple()
has the behavior such that the namescount
andindex
will be served as tuple values if the named tuple includes
those names; if they are absent, then their behavior as methods of
collections.abc.Sequence
is maintained. Therefore the
_result.Row
and_result.LegacyRow
classes have been fixed
so that they work in this same way, maintaining the expected behavior for
database rows that have columns named "index" or "count".References: #6074
mssql
-
[mssql] [bug] [regression] Fixed regression where a new setinputsizes() API that's available for
pyodbc was enabled, which is apparently incompatible with pyodbc's
fast_executemany() mode in the absence of more accurate typing information,
which as of yet is not fully implemented or tested. The pyodbc dialect and
connector has been modified so that setinputsizes() is not used at all
unless the parameteruse_setinputsizes
is passed to the dialect, e.g.
via_sa.create_engine()
, at which point its behavior can be
customized using theDialectEvents.do_setinputsizes()
hook.References: #6058