2.0.45
Released: December 9, 2025
orm
-
[orm] [bug] Fixed issue where calling
Mapper.add_property()within mapper event
hooks such asMapperEvents.instrument_class(),
MapperEvents.after_mapper_constructed(), or
MapperEvents.before_mapper_configured()would raise an
AttributeErrorbecause the mapper's internal property collections were
not yet initialized. TheMapper.add_property()method now handles
early-stage property additions correctly, allowing properties including
column properties, deferred columns, and relationships to be added during
mapper initialization events. Pull request courtesy G Allajmi.References: #12858
-
[orm] [bug] Fixed issue in Python 3.14 where dataclass transformation would fail when
a mapped class usingMappedAsDataclassincluded a
relationship()referencing a class that was not available at
runtime (e.g., within aTYPE_CHECKINGblock). This occurred when using
Python 3.14's PEP 649 deferred annotations feature, which is the
default behavior without afrom __future__ import annotations
directive.References: #12952
examples
- [examples] [bug] Fixed the "short_selects" performance example where the cache was being
used in all the examples, making it impossible to compare performance with
and without the cache. Less important comparisons like "lambdas" and
"baked queries" have been removed.
sql
-
[sql] [bug] Some improvements to the
_sql.ClauseElement.params()method to
replace bound parameters in a query were made, however the ultimate issue
in #12915 involving ORM_orm.aliased()cannot be fixed fully
until 2.1, where the method is being rewritten to work without relying on
Core cloned traversal.References: #12915
-
[sql] [bug] Fixed issue where using the
ColumnOperators.in_()operator with a
nestedCompoundSelectstatement (e.g. anINTERSECTof
UNIONqueries) would raise aNotImplementedErrorwhen the
nested compound select was the first argument to the outer compound select.
The_scalar_type()internal method now properly handles nested compound
selects.References: #12987
typing
-
[typing] [bug] Fixed typing issue where
Select.with_for_update()would not support
lists of ORM entities or other FROM clauses in the
Select.with_for_update.ofparameter. Pull request courtesy
Shamil.References: #12730
-
[typing] [bug] Fixed typing issue where
coalescewould not return the correct
return type when a nullable form of that argument were passed, even though
this function is meant to select the non-null entry among possibly null
arguments. Pull request courtesy Yannick PÉROUX.
postgresql
-
[postgresql] [usecase] Added support for reflection of collation in types for PostgreSQL.
Thecollationwill be set only if different from the default
one for the type.
Pull request courtesy Denis Laxalde.References: #6511
-
[postgresql] [bug] Fixed issue where PostgreSQL dialect options such as
postgresql_include
onPrimaryKeyConstraintandUniqueConstraintwere
rendered in the wrong position when combined with constraint deferrability
options likedeferrable=True. Pull request courtesy G Allajmi.References: #12867
-
[postgresql] [bug] Fixed the structure of the SQL string used for the
engine_insertmanyvaluesfeature when an explicit sequence with
nextval()is used. The SQL function invocation for the sequence has
been moved from being rendered inline within each tuple inside of VALUES to
being rendered once in the SELECT that reads from VALUES. This change
ensures the function is invoked in the correct order as rows are processed,
rather than assuming PostgreSQL will execute inline function calls within
VALUES in a particular order. While current PostgreSQL versions appear to
handle the previous approach correctly, the database does not guarantee
this behavior for future versions.References: #13015
mysql
-
[mysql] [usecase] Added support for MySQL 8.0.1 +
FOR SHAREto be emitted for the
Select.with_for_update()method, which offers compatibility with
NOWAITandSKIP LOCKED. The new syntax is used only for MySQL when
version 8.0.1 or higher is detected. Pull request courtesy JetDrag.References: #12964
sqlite
-
[sqlite] [bug] [reflection] A series of improvements have been made for reflection of CHECK constraints
on SQLite. The reflection logic now correctly handles table names
containing the strings "CHECK" or "CONSTRAINT", properly supports all four
SQLite identifier quoting styles (double quotes, single quotes, brackets,
and backticks) for constraint names, and accurately parses CHECK constraint
expressions containing parentheses within string literals using balanced
parenthesis matching with string context tracking. Big thanks to
GruzdevAV for new test cases and implementation ideas.References: #12924
-
[sqlite] [bug] Fixed issue where SQLite dialect would fail to reflect constraint names
that contained uppercase letters or other characters requiring quoting. The
regular expressions used to parse primary key, foreign key, and unique
constraint names from theCREATE TABLEstatement have been updated to
properly handle both quoted and unquoted constraint names.References: #12954
tests
- [tests] [change] A noxfile.py has been added to allow testing with nox. This is a direct
port of 2.1's move to nox, however leaves the tox.ini file in place and
retains all test documentation in terms of tox. Version 2.1 will move to
nox fully, including deprecation warnings for tox and new testing
documentation.