# SQLAlchemy rel_2_1_0rc1 — 2.1.0rc1 - Product: SQLAlchemy (https://whatsnew.fyi/product/sqlalchemy) - Vendor: SQLAlchemy - Date: 2026-08-31 - Version: rel_2_1_0rc1 - Original notes: https://github.com/sqlalchemy/sqlalchemy/releases/tag/rel_2_1_0rc1 - Permalink: https://whatsnew.fyi/product/sqlalchemy/releases/rel-2-1-0rc1 - Labels: Pre-release What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. --- #### 2.1.0rc1 Released: August 31, 2026 ##### platform - **[platform] [change]** Python 3.11 or above is now required; support for Python 3.10 is dropped, in addition to the drop of versions Python 3.9, 3.8 and 3.7 introduced in 2.1.0b1. Python 3.10 reaches EOL in October of 2026, so dropping support now gives the SQLAlchemy 2.1 series an extra year of space to remain on current Python versions. - **[platform] [bug]** Python 3.15 support has been added and tested, including minimal changes for full compatibility. This change is also **backported** to: 2.0.52 References: [#13477](https://www.sqlalchemy.org/trac/ticket/13477) ##### orm - **[orm] [usecase]** Improved the error message raised when a `Session` is used inside a context manager after the transaction has been rolled back due to an exception. The `InvalidRequestError` now includes the original exception that triggered the rollback, making it clearer why the transaction is no longer active. Pull request courtesy Ilan Keshet. References: [#11297](https://www.sqlalchemy.org/trac/ticket/11297) - **[orm] [usecase]** Improved error messages raised when ORM loader strategy options cannot be applied to a query. Messages now render the offending option in a user-friendly form such as `joinedload(User.orders)` rather than exposing internal class and path representations, and the "does not apply to root entities" message now includes the option that triggered the error. The same user-friendly rendering is also applied to the "conflicting loader strategy" message and to the `of_type()` representation in "does not link" messages. Originating pull request courtesy Jan Vollmer. References: [#12398](https://www.sqlalchemy.org/trac/ticket/12398) - **[orm] [usecase]** Python source generated at runtime is now compiled against a descriptive filename which is registered with the `linecache` module, so that generated functions appearing on a stack trace render with their source rather than as an opaque `File ""` frame. This allows tools like `pdb` and `inspect.getsource()` to work with these generated source blocks as well. The new feature is applied to the instrumentation applied to an ORM object's `__init__` method, as well as throughout SQLAlchemy functions that are internally instrumented. References: [#13505](https://www.sqlalchemy.org/trac/ticket/13505) - **[orm] [usecase]** When a subclass overrides a `_orm.validates()` method using the same method name as the parent class, only the subclass validator is now invoked for instances of the subclass. The subclass validator may call `super()` to also invoke the parent class validator. Previously, the parent validator was always used regardless of whether the subclass provided an override. Pull request courtesy Indivar Mishra. References: [#2943](https://www.sqlalchemy.org/trac/ticket/2943) - **[orm] [bug]** Fixed a result-column misalignment bug in ORM-enabled UPDATE statements where `synchronize_session="fetch"` is in use, either explicitly or because the statement uses constructs such as CTEs that implicitly select for it. Columns in rows returned by `.returning()` could be returned under incorrect keys (e.g. `row[SomeClass.a]` returning the value of a different column), a problem most likely to manifest under concurrent workloads. ORM DELETE statements were not affected. This change is also **backported** to: 2.0.52 References: [#13439](https://www.sqlalchemy.org/trac/ticket/13439) - **[orm] [bug]** Fixed bug where a failed `_orm.Session.bulk_insert_mappings()`, `_orm.Session.bulk_update_mappings()` or `_orm.Session.bulk_save_objects()` call could leave the `_orm.Session` permanently in a "flushing" state, such as when the transaction could not be begun because a p _[Truncated at 4000 characters — full notes: https://github.com/sqlalchemy/sqlalchemy/releases/tag/rel_2_1_0rc1]_