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(), orMapperEvents.before_mapper_configured()would raise anAttributeErrorbecause 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 using
MappedAsDataclassincluded arelationship()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 annotationsdirective.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. anINTERSECTofUNIONqueries) 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 theSelect.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. The
collationwill 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_includeonPrimaryKeyConstraintandUniqueConstraintwere 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 withnextval()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 theSelect.with_for_update()method, which offers compatibility withNOWAITandSKIP 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 the
CREATE 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.