github sqlalchemy/sqlalchemy rel_2_0_45
2.0.45

15 hours ago

2.0.45

Released: December 9, 2025

orm

  • [orm] [bug] Fixed issue where calling Mapper.add_property() within mapper event
    hooks such as MapperEvents.instrument_class(),
    MapperEvents.after_mapper_constructed(), or
    MapperEvents.before_mapper_configured() would raise an
    AttributeError because the mapper's internal property collections were
    not yet initialized. The Mapper.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 MappedAsDataclass included a
    relationship() referencing a class that was not available at
    runtime (e.g., within a TYPE_CHECKING block). This occurred when using
    Python 3.14's PEP 649 deferred annotations feature, which is the
    default behavior without a from __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
    nested CompoundSelect statement (e.g. an INTERSECT of
    UNION queries) would raise a NotImplementedError when 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.of parameter. Pull request courtesy
    Shamil.

    References: #12730

  • [typing] [bug] Fixed typing issue where coalesce would 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 collation will 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
    on PrimaryKeyConstraint and UniqueConstraint were
    rendered in the wrong position when combined with constraint deferrability
    options like deferrable=True. Pull request courtesy G Allajmi.

    References: #12867

  • [postgresql] [bug] Fixed the structure of the SQL string used for the
    engine_insertmanyvalues feature 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 SHARE to be emitted for the
    Select.with_for_update() method, which offers compatibility with
    NOWAIT and SKIP 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 TABLE statement 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.

Don't miss a new sqlalchemy release

NewReleases is sending notifications on new releases.