]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/log
thirdparty/sqlalchemy/sqlalchemy.git
10 days agoAdd a test for #13021
Mike Bayer [Wed, 3 Dec 2025 19:48:08 +0000 (14:48 -0500)] 
Add a test for #13021

Confirmed the upstream fix for [1] given at [2] solves the issue
illustrated here, this patch adds a test for this case as our
existing tests did not catch this error in python 3.14.1.

Fixes: #13021
Change-Id: Ie6827279ccf2b2cb2e0fe6029aafdcfefc790f1f

10 days agoMerge "send same sub_stmt to after_cursor_execute as before" into main
Michael Bayer [Wed, 3 Dec 2025 19:17:16 +0000 (19:17 +0000)] 
Merge "send same sub_stmt to after_cursor_execute as before" into main

10 days agoMerge "run sentinel server side fns outside of VALUES" into main
Michael Bayer [Wed, 3 Dec 2025 16:56:08 +0000 (16:56 +0000)] 
Merge "run sentinel server side fns outside of VALUES" into main

10 days agoMerge "block json tests for non-json backends" into main
Michael Bayer [Wed, 3 Dec 2025 13:13:17 +0000 (13:13 +0000)] 
Merge "block json tests for non-json backends" into main

10 days agoMerge "[typing] Fix type error when passing Mapped columns to values()" into main
Federico Caselli [Wed, 3 Dec 2025 07:41:20 +0000 (07:41 +0000)] 
Merge "[typing] Fix type error when passing Mapped columns to values()" into main

10 days agoblock json tests for non-json backends
Mike Bayer [Wed, 3 Dec 2025 04:18:58 +0000 (23:18 -0500)] 
block json tests for non-json backends

these were failing on Oracle which has no json type

Change-Id: I3c35c4f38c581378c74ee9dc3fb7a71655c5ee9c

10 days agosend same sub_stmt to after_cursor_execute as before
Mike Bayer [Wed, 3 Dec 2025 04:10:10 +0000 (23:10 -0500)] 
send same sub_stmt to after_cursor_execute as before

Fixed issue in the :meth:`.ConnectionEvents.after_cursor_execute` method
where the SQL statement and parameter list for an "insertmanyvalues"
operation sent to the event would not be the actual SQL / parameters just
emitted on the cursor, instead being the non-batched form of the statement
that's used as a template to generate the batched statements.

Fixes: #13018
Change-Id: Ib5b6c576f2c7a9ed275de30290d619cc651b4816

10 days agorun sentinel server side fns outside of VALUES
Mike Bayer [Mon, 1 Dec 2025 20:11:50 +0000 (15:11 -0500)] 
run sentinel server side fns outside of VALUES

Fixed the structure of the SQL string used for the
:ref:`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.

Fixes: #13015
Change-Id: Ia0a2a4e8f89e21852d7cb550dfa5d9ea9447b590

10 days ago[typing] Fix type error when passing Mapped columns to values()
Yossi [Mon, 1 Dec 2025 17:06:12 +0000 (12:06 -0500)] 
[typing] Fix type error when passing Mapped columns to values()

This adjusts the _DMLOnlyColumnArgument type to be a more
focused _OnlyColumnArgument type where we also add a more tightly
focused coercion, while still allowing ORM attributes to be used
as arguments.

Co-authored-by: Mike Bayer <mike_mp@zzzcomputing.com>
Closes: #13012
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/13012
Pull-request-sha: 5ebb402c686abf1090e5b83e3489dfca4908efdf

Change-Id: I8bbccaf556ec5ecb2f5cfdd2030bcfa4eb5ce125

10 days agodoc updates
Mike Bayer [Wed, 3 Dec 2025 01:06:50 +0000 (20:06 -0500)] 
doc updates

Change-Id: I60bccf962e4cd1ed567a772c43c969c4807662f6

11 days agoMerge "Add native BOOLEAN type support for Oracle 23c and later versions" into main
Federico Caselli [Tue, 2 Dec 2025 21:51:25 +0000 (21:51 +0000)] 
Merge "Add native BOOLEAN type support for Oracle 23c and later versions" into main

11 days agoMerge "Type postgresql.ExcludeConstraint()" into main
Federico Caselli [Tue, 2 Dec 2025 19:45:15 +0000 (19:45 +0000)] 
Merge "Type postgresql.ExcludeConstraint()" into main

11 days agoAdd native BOOLEAN type support for Oracle 23c and later versions
Yeongbae Jeon [Sun, 23 Nov 2025 11:44:43 +0000 (06:44 -0500)] 
Add native BOOLEAN type support for Oracle 23c and later versions

Added support for native BOOLEAN support in Oracle Database 23c and above.
The Oracle dialect now renders ``BOOLEAN`` automatically when
:class:`.Boolean` is used in DDL, and also now supports direct use of the
:class:`.BOOLEAN` datatype, when 23c and above is in use.  For Oracle
versions prior to 23c, boolean values continue to be emulated using
SMALLINT as before.   Special case handling is also present to ensure a
SMALLINT that's interpreted with the :class:`.Boolean` datatype on Oracle
Database 23c and above continues to return bool values. Pull request
courtesy Yeongbae Jeon.

Co-authored-by: Mike Bayer <mike_mp@zzzcomputing.com>
Fixes: #11633
Closes: #13000
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/13000
Pull-request-sha: 65b8a2c92f539c57ab6b0b1bf045bd23eedb1695

Change-Id: I13be32f6bad5d918f6c7c9622f0deae78f5c6551

11 days agoremove sqlalchemy ML
Mike Bayer [Mon, 1 Dec 2025 23:20:02 +0000 (18:20 -0500)] 
remove sqlalchemy ML

Change-Id: I85fbdd8b2b3e5ae0c3a99e98f942865d92351f2f

12 days agoadd wheels for python 3.14
Mike Bayer [Mon, 1 Dec 2025 20:21:58 +0000 (15:21 -0500)] 
add wheels for python 3.14

Change-Id: Ia69c9e728e38622d643752b61b0627b3baae5089

12 days agoType postgresql.ExcludeConstraint()
Denis Laxalde [Mon, 1 Dec 2025 10:43:18 +0000 (05:43 -0500)] 
Type postgresql.ExcludeConstraint()

Related to #6810.

Closes: #13011
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/13011
Pull-request-sha: 4a212cad1b231629ae4e3d6866c9603662a197a2

Change-Id: If5d91e06b6c0afc11adc02bb0c0d5ce97e53203c

13 days agoadd TString support
Mike Bayer [Mon, 17 Nov 2025 18:11:24 +0000 (13:11 -0500)] 
add TString support

Added support for Python 3.14+ template strings (t-strings) via the new
:func:`_sql.tstring` construct, as defined in :pep:`750`. This feature
allows for ergonomic SQL statement construction by automatically
interpolating Python values and SQLAlchemy expressions within template
strings.

Part of the challenge here is the syntax only works on py314, so we have
to exclude the test file at many levels when py314 is not used.  not
sure yet how i want to adjust pep8 tests and rules for this.

Fixes: #12548
Change-Id: Ia060d1387ff452fe4f5d924f683529a22a8e1f72

13 days agouse oracledb as default in setup, update URLs
Mike Bayer [Sun, 30 Nov 2025 16:39:04 +0000 (11:39 -0500)] 
use oracledb as default in setup, update URLs

part of :ticket:`13010`, as CI is now oracledb centric
move setup.cfg / pyproject installs / URLs to be oracledb first.
use 23c URLs now that we are on this platform.

Change-Id: I1253c76c382637987e67e36b3d5c82081cd306a8

2 weeks agoadditional fixes re: mariadb innodb etc.
Mike Bayer [Sat, 29 Nov 2025 03:47:40 +0000 (22:47 -0500)] 
additional fixes re: mariadb innodb etc.

fix a bunch of side effects that were not tested in the gerrit
phase because we run with --backendonly

Change-Id: Iebcedb962e6e11dd247b0da5f309a71db711694c

2 weeks agodrop a 400 ton anvil on oracle 23c
Mike Bayer [Thu, 27 Nov 2025 06:22:38 +0000 (01:22 -0500)] 
drop a 400 ton anvil on oracle 23c

this DB is extremely erratic in being able to connect.   Add
a brute force connection retrier to all engines everywhere
(which for oracledb we can fortunately use their built-in feature
that also works).
This actually works and I can see it pausing under load, reconnecting,
and succeeding.  the problem is that absolutely every engine everywhere
needs this routine otherwise an engine without a retrier in it will
crash.    That then necessitates digging into testing_engine(),
making sure testing_engine() is used everywhere an engine that's going
to connect is used, then dealing with the fallout from that.

We also simplify some older workarounds for cx_oracle and
hack into config/provision to make oracledb seem like the primary
DBAPI for most tests.

testing_engine has been completely overhauled, making use of a new
post_configure_testing_engine() hook which moves and refines
the SQLite pool sharing and savepoint logic all into sqlite/provision.py
and also allows for cx_oracle to apply a retry event handler.

Change-Id: I4ea4c523effb878290d28b94d8925eb32fc5ae3b

2 weeks agohappy mypy day
Mike Bayer [Fri, 28 Nov 2025 16:48:22 +0000 (11:48 -0500)] 
happy mypy day

Change-Id: Ic72aeea508e73344927692f62332b2b62a8cbdea

2 weeks agodelete cython in place files before running pep8
Mike Bayer [Thu, 27 Nov 2025 16:32:32 +0000 (11:32 -0500)] 
delete cython in place files before running pep8

slotscheck otherwise can get confused if there are stale
.so files present

Change-Id: Ic855101f7ad6c92d2404331408ca6f02db0c49be

2 weeks agoMerge "stop using MyISAM; more oracle struggles" into main
Michael Bayer [Thu, 27 Nov 2025 04:40:35 +0000 (04:40 +0000)] 
Merge "stop using MyISAM; more oracle struggles" into main

2 weeks agostop using MyISAM; more oracle struggles
Mike Bayer [Wed, 26 Nov 2025 06:36:57 +0000 (01:36 -0500)] 
stop using MyISAM; more oracle struggles

getting some fails on mariadb12 and likely 11 which appear to
be related to calling in MyISAM, which is not used in
modern mysql/mariadb.   see if we can just remove this whole
thing and rely on default engines for mariadb/mysql.

this change also removes the "ignore errors" part of the
run deletes for the TablesTest fixture, which was resulting
in compound failures, and apparently a lot of tests were relying
on it skipping nonexistent tables.   rather than check for that
we should just improve the tests and probably increase use of
pytest style fixtures overall.

this change also identifies and fixes that memusage_w_backend
tests were running for all backends with a tag like
py314_mysql_backendonly; the memusage tests should basically
never be run as part of the whole suite since they are entirely
unreliable within a full scale test run.

dialect suite tests are also further broken out into those where
every driver should be exercised (i.e. __backend__, for tests that
test datatypes going out and coming back from the database as well
as identity/autoincrement kinds of tests) vs. those where only
one driver per backend is needed (i.e. __sparse_driver_backend__,
for tests like reflection, DDL, CTEs, etc.).

we are also trying to get a --low-connections option that actually
works.  changed this so that the testing reaper aggressively disposes
the "global" engines (one per backend / driver) after test classes
are done and before any testing_engine() call.   This definitely
works, however some monitoring with PG shows the number of connections
still has brief bursts for some reason.   it should be much more
effective than before though as oracle 23/26 really does not handle
more than a few connections.

this change reverts oracle to oracle18c for now in setup.cfg;
further work will be needed to determine if oracle23c can be
run with this test suite

Change-Id: Id87d0ea15155c452615a7edeb9d434c8e55151e7

2 weeks agore-enable vectore test in oracle
Federico Caselli [Tue, 25 Nov 2025 21:48:01 +0000 (22:48 +0100)] 
re-enable vectore test in oracle

Change-Id: I382a20027f36f32617d2680332873f1b7d5bcee6

2 weeks agotest oracle 23c, mariadb12; reduce backend use
Mike Bayer [Tue, 25 Nov 2025 00:33:18 +0000 (19:33 -0500)] 
test oracle 23c, mariadb12; reduce backend use

one particular vector test wont run on oracle 23c free, so
just disable it.

added better skips for the rest of the vector tests and
fixed a deprecation issue.

this will be the first run on the new oracle23 on CI so we'll have to
see how this goes.

Also adjust for mariabdb12 being overly helpful with regards
to stale row updates.

as we are having trouble getting 23c to pass throug transaction
tests, i noted we have an explosion of tests due to the multiple
drivers, so this patch introduces __sparse_driver_backend__
for all tests where we want variety of
database server but there's no need to test every driver.
This should dramatically reduce the size of the test suite run

Change-Id: Ic8d3eb0a60e76b4c54c6bb4a721f90c81ede782b

3 weeks agobreak up test_update_delete_where into several files
Mike Bayer [Fri, 21 Nov 2025 18:44:31 +0000 (13:44 -0500)] 
break up test_update_delete_where into several files

it's grown to 3K lines and i need to add more tests

Change-Id: Ic55c50446d57789e3e3cc58e6a99239c1bfa8328

3 weeks agoFix parameter mutation in orm_pre_session_exec()
Shamil [Thu, 20 Nov 2025 12:44:34 +0000 (07:44 -0500)] 
Fix parameter mutation in orm_pre_session_exec()

The :meth:`_events.SessionEvents.do_orm_execute` event now allows direct
mutation or replacement of the :attr:`.ORMExecuteState.parameters`
dictionary or list, which will take effect when the the statement is
executed.  Previously, changes to this collection were not accommodated by
the event hook.  Pull request courtesy Shamil.

Fixes: #12921
Closes: #12989
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/12989
Pull-request-sha: 86b64e06178f8722f1c1700fd9fcca53ca572e78

Change-Id: I04874b6ca720eb2be1470067ced4afd79896e267

3 weeks agouse zimports 0.7.0
Mike Bayer [Thu, 20 Nov 2025 18:44:09 +0000 (13:44 -0500)] 
use zimports 0.7.0

this adds pyproject.toml support

Change-Id: I6d00fc912f25405542326c3d0ffcfb1969cea24b

3 weeks agoFix type hint for with_for_update() to support tuples of table classes
Shamil [Wed, 19 Nov 2025 13:02:28 +0000 (08:02 -0500)] 
Fix type hint for with_for_update() to support tuples of table classes

Fixed typing issue where :meth:`.Select.with_for_update` would not support
lists of ORM entities in the :paramref:`.Select.with_for_update.of`
parameter. Pull request courtesy Shamil.

Fixes: #12730
Closes: #12988
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/12988
Pull-request-sha: 41a38bfe38d8b66da853012e7165cc0cacf7f28a

Change-Id: I61d60a4f4d2b16037da8d5f30e33f5d74fa47374

3 weeks agouse py3.14 for pep484/pep8
Mike Bayer [Tue, 18 Nov 2025 22:24:45 +0000 (17:24 -0500)] 
use py3.14 for pep484/pep8

since we updated this recently

Change-Id: I25fe3dae099aca608798b7d28b952855acda230f

3 weeks agopropagate _scalar_type() for SelectStatementGrouping
Mike Bayer [Tue, 18 Nov 2025 20:10:05 +0000 (15:10 -0500)] 
propagate _scalar_type() for SelectStatementGrouping

Fixed issue where using the :meth:`.ColumnOperators.in_` operator with a
nested :class:`.CompoundSelect` statement (e.g. an ``INTERSECT`` of
``UNION`` queries) would raise a :class:`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.

Fixes: #12987
Change-Id: I6aa1b38863588d371bbac74b3531b99ccd5fcaec

3 weeks agoupdate lint setup
Mike Bayer [Mon, 17 Nov 2025 21:32:54 +0000 (16:32 -0500)] 
update lint setup

We are stuck on flake8 because we rely on many plugins with
specific behaviors.  The situation has calcified where:

1. the whole world uses ruff
2. nobody cares about import order linting or all the other stuff
   we do, and/or similar but not quite the same things are embedded
   deeply into ruff which would require us giving up a lot of our
   standards (like isort)
3. flake8 is absolutely never going to support pyproject.
4. flake8-pyproject works for this

beyond that, for t string support we want to make it easy
to get onto py3.14, so here we update black to the latest which
appears to fix some missing symbols for py3.14 t strings.

we should also migrate the remaining sqlalchemy test config
from setup.cfg to pyproject.toml but that should likely be
2.1 only

Change-Id: I896a7c839148d0ef516728c73baddc8eddf5ee96

3 weeks agoadd highlight for python3 over api doc sections
Mike Bayer [Sun, 16 Nov 2025 15:55:54 +0000 (10:55 -0500)] 
add highlight for python3 over api doc sections

the pycon+sql highlight seems to take effect for docstrings
now in sphinx 8 or whatever.

Fixes: #12981
Change-Id: Ifab2c66d6adddf3ce5336f244653a336ac0d2ce9

4 weeks agoAdd DictBundle
Federico Caselli [Mon, 3 Nov 2025 22:04:45 +0000 (23:04 +0100)] 
Add DictBundle

Added :class:`_orm.DictBundle` as a subclass of :class:`_orm.Bundle`
that returns ``dict`` objects.

Fixes: #12960
Change-Id: I798fb917779eb95bda575f2809e58c2f6d3c4706

4 weeks agoadd pyv to file template; use = for all custom args
Mike Bayer [Sat, 15 Nov 2025 16:36:56 +0000 (11:36 -0500)] 
add pyv to file template; use = for all custom args

adding "test/" to pytest doesnt work because then we can't indicate
a specific set of test files.  use = for all sqlalchemy-custom
parameters instead to avoid [1]

[1] https://github.com/pytest-dev/pytest/issues/13913

Change-Id: I9eb5bbfac734fcb145fcf3ae58fcc55df6bb6e71

4 weeks agoperf tuning of `BaseRow`
Albert N [Sat, 25 Oct 2025 17:45:57 +0000 (13:45 -0400)] 
perf tuning of `BaseRow`

common cases are a bit faster overall

Python version
|                      | python opt | python main | py opt / main |
| -------------------- | ---------- | ----------- | ------------- |
| base_row_new         | 0.84959    | 0.86417     | 0.9831283197  |
| row_new              | 0.85698    | 0.85543     | 1.001811954   |
| base_row_new_proc    | 2.77489    | 2.81795     | 0.9847193882  |
| row_new_proc         | 2.77881    | 2.86206     | 0.9709125595  |
| brow_new_proc_none   | 1.6311     | 1.65773     | 0.9839358641  |
| row_new_proc_none    | 1.65048    | 1.69896     | 0.9714648962  |
| row_dumps            | 0.15279    | 0.14519     | 1.052345203   |
| row_loads            | 0.91471    | 0.91358     | 1.001236892   |
| row_values_impl      | 0.1818     | 0.17773     | 1.022899904   |
| row_iter             | 0.44042    | 0.4554      | 0.967105841   |
| row_len              | 0.13858    | 0.13079     | 1.059561129   |
| row_hash             | 0.28614    | 0.29172     | 0.9808720691  |
| getitem              | 0.23159    | 0.23138     | 1.000907598   |
| getitem_slice        | 0.38393    | 0.38765     | 0.9904037147  |
| get_by_key           | 0.33692    | 0.33913     | 0.993483325   |
| get_by_key2          | 0.35105    | 0.33915     | 1.035087719   |
| getattr              | 0.46809    | 0.46911     | 0.9978256699  |
| get_by_key_recreate  | 1.08137    | 1.18224     | 0.9146789146  |
| get_by_key_recreate2 | 0.98543    | 0.99272     | 0.9926565396  |
| getattr_recreate     | 0.74       | 0.7407      | 0.999054948   |
| contains             | 0.49312    | 0.74477     | 0.6621104502  |

Cython version
|                      | cython opt | cython main | cy opt / main |
| -------------------- | ---------- | ----------- | ------------- |
| base_row_new         | 0.12933    | 0.1347      | 0.9601336303  |
| row_new              | 0.15755    | 0.16489     | 0.9554854752  |
| base_row_new_proc    | 0.87398    | 1.08483     | 0.8056377497  |
| row_new_proc         | 0.88592    | 1.13255     | 0.7822347799  |
| brow_new_proc_none   | 0.2664     | 0.41703     | 0.6388029638  |
| row_new_proc_none    | 0.27526    | 0.42483     | 0.6479297601  |
| row_dumps            | 0.37526    | 0.20093     | 1.867615588   |
| row_loads            | 0.53037    | 0.3607      | 1.470390907   |
| row_values_impl      | 0.36886    | 0.22218     | 1.660185435   |
| row_iter             | 0.25249    | 0.25553     | 0.9881031581  |
| row_len              | 0.05194    | 0.05412     | 0.9597191426  |
| row_hash             | 0.18864    | 0.18726     | 1.007369433   |
| getitem              | 0.13876    | 0.13934     | 0.9958375197  |
| getitem_slice        | 0.23181    | 0.2318      | 1.000043141   |
| get_by_key           | 0.17031    | 0.17857     | 0.9537436299  |
| get_by_key2          | 0.58172    | 0.31651     | 1.837919813   |
| getattr              | 0.21275    | 1.16669     | 0.1823534958  |
| get_by_key_recreate  | 0.80161    | 0.8836      | 0.9072091444  |
| get_by_key_recreate2 | 1.14649    | 0.98709     | 1.161484768   |
| getattr_recreate     | 0.55927    | 1.09921     | 0.5087926784  |
| contains             | 0.35338    | 0.5494      | 0.6432107754  |

Closes: #12919
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/12919
Pull-request-sha: b13204b7416083ccff09a45291b11fd606ff0fbd

Change-Id: I5ff2b951f9840e99abdad3ae286ecb8becc70e4b

4 weeks agoAdd Mimer SQL to list of external dialects (#12969)
Fredrik Ã…lund [Wed, 12 Nov 2025 23:05:21 +0000 (00:05 +0100)] 
Add Mimer SQL to list of external dialects (#12969)

4 weeks agoupdate profiles
Mike Bayer [Wed, 12 Nov 2025 15:16:34 +0000 (10:16 -0500)] 
update profiles

adds the ORM profiling tests to backend so that they run
on gerrits that use backendonly for nocext

fix CI only failures

Change-Id: Id36a9bcef1250af58f968a62edb3e7b7cb84f673

4 weeks agocleanup test after 98361f19a8144cbc8d528c62a873786be65fc026
Federico Caselli [Tue, 11 Nov 2025 21:45:18 +0000 (22:45 +0100)] 
cleanup test after 98361f19a8144cbc8d528c62a873786be65fc026

Change-Id: Ie8196f0eff034e29e58503ef8a873d3a17747721

4 weeks agoMerge "Typing: fix type of func.coalesce when used with hybrid properties" into main
Michael Bayer [Tue, 11 Nov 2025 21:43:51 +0000 (21:43 +0000)] 
Merge "Typing: fix type of func.coalesce when used with hybrid properties" into main

4 weeks agoTyping: fix type of func.coalesce when used with hybrid properties
Yannick PÉROUX [Tue, 4 Nov 2025 17:58:03 +0000 (12:58 -0500)] 
Typing: fix type of func.coalesce when used with hybrid properties

Fixed typing issue where :class:`.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.

Closes: #12963
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/12963
Pull-request-sha: 05d0d9784d4497fb3bfee540fbc51747c1767c90

Change-Id: Ife83a384ea57faf446c1fdb542df14627348f40f

4 weeks agoMerge "Add DDL association to Table, CreateView support" into main
Michael Bayer [Tue, 11 Nov 2025 14:48:55 +0000 (14:48 +0000)] 
Merge "Add DDL association to Table, CreateView support" into main

4 weeks agoMerge "feat: Support MySQL FOR SHARE locking syntax." into main
Michael Bayer [Tue, 11 Nov 2025 01:20:23 +0000 (01:20 +0000)] 
Merge "feat: Support MySQL FOR SHARE locking syntax." into main

4 weeks agofeat: Support MySQL FOR SHARE locking syntax.
JetDrag [Wed, 5 Nov 2025 03:47:02 +0000 (22:47 -0500)] 
feat: Support MySQL FOR SHARE locking syntax.

Added support for MySQL 8.0.1 + ``FOR SHARE`` to be emitted for the
:meth:`.Select.with_for_uddate` 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.

Fixes: #10134
Closes: #12964
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/12964
Pull-request-sha: 03d5e37cfda5da9dab8ae00aa682521f8ab9190b

Change-Id: Iafb7a24363284edcfeead94a348f50a470a88403

4 weeks agoMerge "remove use of `LABEL_STYLE_TABLENAME_PLUS_COL` outside of Query" into main
Michael Bayer [Mon, 10 Nov 2025 22:56:57 +0000 (22:56 +0000)] 
Merge "remove use of `LABEL_STYLE_TABLENAME_PLUS_COL` outside of Query" into main

4 weeks agoMerge "Improve params implementation" into main
Michael Bayer [Mon, 10 Nov 2025 22:56:40 +0000 (22:56 +0000)] 
Merge "Improve params implementation" into main

4 weeks agoImprove params implementation
Federico Caselli [Thu, 16 Oct 2025 18:59:30 +0000 (20:59 +0200)] 
Improve params implementation

Added new implementation for the :meth:`.Select.params` method and that of
similar statements, via a new statement-only
:meth:`.ExecutableStatement.params` method which works more efficiently and
correctly than the previous implementations available from
:class:`.ClauseElement`, by assocating the given parameter dictionary with
the statement overall rather than cloning the statement and rewriting its
bound parameters.  The :meth:`_sql.ClauseElement.params` and
:meth:`_sql.ClauseElement.unique_params` methods, when called on an object
that does not implement :class:`.ExecutableStatement`, will continue to
work the old way of cloning the object, and will emit a deprecation
warning.    This issue both resolves the architectural / performance
concerns of :ticket:`7066` and also provides correct ORM compatibility for
functions like :func:`_orm.aliased`, reported by :ticket:`12915`.

Fixes: #7066
Change-Id: I6543c7d0f4da3232b3641fb172c24c446f02f52a

4 weeks agoremove use of `LABEL_STYLE_TABLENAME_PLUS_COL` outside of Query
Inada Naoki [Wed, 29 Oct 2025 08:09:14 +0000 (04:09 -0400)] 
remove use of `LABEL_STYLE_TABLENAME_PLUS_COL` outside of Query

Changed the query style for ORM queries emitted by :meth:`.Session.get` as
well as many-to-one lazy load queries to use the default labeling style,
:attr:`_sql.SelectLabelStyle.LABEL_STYLE_DISAMBIGUATE_ONLY`, which normally
does not apply labels to columns in a SELECT statement. Previously, the
older style :attr:`_sql.SelectLabelStyle.LABEL_STYLE_TABLENAME_PLUS_COL`
that labels columns as `<tablename>_<columname>` was used for
:meth:`.Session.get` to maintain compatibility with :class:`_orm.Query`.
The change allows the string representation of ORM queries to be less
verbose in all cases outside of legacy :class:`_orm.Query` use. Pull
request courtesy Inada Naoki.

Fixes: #12932
Closes: #12926
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/12926
Pull-request-sha: 6738a73f635387b8326f546313cdfd12cf9ef5ab

Change-Id: I044a54226a4fcade07adc1a3f5f60b4b3e451a1e

4 weeks agotry pytest 9
Mike Bayer [Mon, 10 Nov 2025 14:55:07 +0000 (09:55 -0500)] 
try pytest 9

moves reqs to pytest<10

Change-Id: I2b026e1d2803e4e0d29a597e33545fe330422d09

4 weeks agochangelog updates
Mike Bayer [Mon, 10 Nov 2025 13:43:41 +0000 (08:43 -0500)] 
changelog updates

Change-Id: I4e108b5a772ec49ae0f07761cadef9bf0f485297

4 weeks agodont fail if imports not set up
Mike Bayer [Mon, 10 Nov 2025 13:43:10 +0000 (08:43 -0500)] 
dont fail if imports not set up

this is to help with vscode extensions

Change-Id: I4dc6c07bec8158c82e376b3399d6e0e104360bf2

4 weeks agofix docs code example
Mike Bayer [Sun, 9 Nov 2025 19:21:07 +0000 (14:21 -0500)] 
fix docs code example

Change-Id: I7b262725e6eedaeef9ebc0e956cae515b68ed9cd

4 weeks agoMerge "be more aggressive in removing all references" into main
Michael Bayer [Sun, 9 Nov 2025 18:29:38 +0000 (18:29 +0000)] 
Merge "be more aggressive in removing all references" into main

4 weeks agobe more aggressive in removing all references
Mike Bayer [Sun, 9 Nov 2025 18:14:48 +0000 (13:14 -0500)] 
be more aggressive in removing all references

python3.14t is showing connections being referenced and not finalized.
explicit closes/disposes and such dont seem to be working but
ensuring globs are cleared out is working better

Change-Id: I0c53f7702027e37ad11bd6e15e828900c8f52213

4 weeks agomigration notes updates
Mike Bayer [Sat, 8 Nov 2025 22:44:09 +0000 (17:44 -0500)] 
migration notes updates

Change-Id: I11847af15cfec7c937ac99eae6b3fd030e26be6d

5 weeks agoMerge "Allow non-integer RANGE in OVER" into main
Michael Bayer [Sat, 8 Nov 2025 19:58:00 +0000 (19:58 +0000)] 
Merge "Allow non-integer RANGE in OVER" into main

5 weeks agoMerge "support subscript for hstore" into main
Michael Bayer [Sat, 8 Nov 2025 19:55:01 +0000 (19:55 +0000)] 
Merge "support subscript for hstore" into main

5 weeks agoAdd DDL association to Table, CreateView support
Mike Bayer [Sat, 25 Oct 2025 17:19:48 +0000 (13:19 -0400)] 
Add DDL association to Table, CreateView support

Added support for the SQL ``CREATE VIEW`` statement via the new
:class:`.CreateView` DDL class. The new class allows creating database
views from SELECT statements, with support for options such as
``TEMPORARY``, ``IF NOT EXISTS``, and ``MATERIALIZED`` where supported by
the target database. Views defined with :class:`.CreateView` integrate with
:class:`.MetaData` for automated DDL generation and provide a
:class:`.Table` object for querying.

this alters the CreateTableAs commit:

* adds the ability for Table to be associated with Create and Drop
  DDL constructs
* Adds CreateView variant of CreateTableAs
* Both associate themselves with Table so they take place in
  create_all/create/drop_all/drop

Fixes: #181
Change-Id: If3e568d3d6a6ce19e3d15198c3fbbe06bd847c83

5 weeks agoadd missing changelog for #12954
Mike Bayer [Tue, 4 Nov 2025 21:56:34 +0000 (16:56 -0500)] 
add missing changelog for #12954

Change-Id: I9b779230c236884dc58f79c97e65bd6c983b252e

5 weeks agodouble guard import issue
Mike Bayer [Tue, 4 Nov 2025 14:56:39 +0000 (09:56 -0500)] 
double guard import issue

3.13 has an import issue, 3.14 has a "hey why are you ignoring here"
issue, solve them both

this then cascaded into zimport uncooperativeness so had to
fix that and put out 0.6.3, so this becomes more of a thing

Change-Id: I5c01e48af2af14be17c3e5f2a53e7913444b98eb

5 weeks agoclarify Core / ORM insert parameter behaviors
Mike Bayer [Tue, 4 Nov 2025 14:13:45 +0000 (09:13 -0500)] 
clarify Core / ORM insert parameter behaviors

it seems to have gotten lost in our newer docs that we're looking
at the first dict only for core insert.  add sections to both
INSERT tutorials explaining this difference

references: #12962
Change-Id: Id2e6c7e7db57fba6aa7838d5c3c65dea1939445a

5 weeks agoAdd order by clause to dialect tests to ensure expected result order
Pat Buxton [Mon, 3 Nov 2025 14:49:33 +0000 (09:49 -0500)] 
Add order by clause to dialect tests to ensure expected result order

<!-- Provide a general summary of your proposed changes in the Title field above -->

### Description
Failing for Starrocks dialect currently without overrides, the amended dialect tests require an order by clause to ensure the expected result.

### Checklist
<!-- go over following points. check them with an `x` if they do apply, (they turn into clickable checkboxes once the PR is submitted, so no need to do everything at once)

-->

This pull request is:

- [x] A short code fix
- please include the issue number, and create an issue if none exists, which
  must include a complete example of the issue.  one line code fixes without an
  issue and demonstration will not be accepted.
- Please include: `Fixes: #<issue number>` in the commit message
- please include tests.   one line code fixes without tests will not be accepted.

Fixes https://github.com/sqlalchemy/sqlalchemy/issues/12956

Closes: #12957
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/12957
Pull-request-sha: 271a014896e0c3d994112dec19029261d4507b6d

Change-Id: Ib8f5bc1caf014026071b83f57011c43c02043746

5 weeks agofix versionadded for aggregate_order_by
Federico Caselli [Sun, 2 Nov 2025 18:54:02 +0000 (19:54 +0100)] 
fix versionadded for aggregate_order_by

Change-Id: I499e0501a20c72cb20ea580b307d4233ba01d508

6 weeks agouse the default driver for sparse backend
Mike Bayer [Sat, 1 Nov 2025 13:56:18 +0000 (09:56 -0400)] 
use the default driver for sparse backend

the memusage tests use sparse_backend but should use the
main driver in a set; they were using the pysqlite_numeric
dialect which is not a real dialect and apparently runs
dramatically slower for the memusage tests since it generates
more memory artifacts.

Change-Id: Icf19ac1a3cae862a48ddcec565079c960b8ac2b7

6 weeks agoMerge "fix sqlite regex for quoted fk, pk names" into main
Michael Bayer [Sat, 1 Nov 2025 04:20:38 +0000 (04:20 +0000)] 
Merge "fix sqlite regex for quoted fk, pk names" into main

6 weeks agofix sqlite regex for quoted fk, pk names
Mike Bayer [Sat, 1 Nov 2025 02:57:28 +0000 (22:57 -0400)] 
fix sqlite regex for quoted fk, pk names

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.

Fixes: #12954
Change-Id: If5c24f536795e5db867d857242013610a04638fc

6 weeks agosupport subscript for hstore
Mike Bayer [Fri, 31 Oct 2025 18:08:05 +0000 (14:08 -0400)] 
support subscript for hstore

Added support for PostgreSQL 14+ HSTORE subscripting syntax. When connected
to PostgreSQL 14 or later, HSTORE columns now automatically use the native
subscript notation ``hstore_col['key']`` instead of the arrow operator
``hstore_col -> 'key'`` for both read and write operations. This provides
better compatibility with PostgreSQL's native HSTORE subscripting feature
while maintaining backward compatibility with older PostgreSQL versions.

as part of this change we add a new parameter to custom_op "visit_name"
which allows a custom op to refer to a specific visit method in a
dialect's compiler.

Fixes: #12948
Change-Id: Id98d333fe78e31d9c7679cb2902f1c7e458d6e11

6 weeks agoensure util.get_annotations() is used
Mike Bayer [Fri, 31 Oct 2025 15:51:37 +0000 (11:51 -0400)] 
ensure util.get_annotations() is used

Fixed issue in Python 3.14 where dataclass transformation would fail when
a mapped class using :class:`.MappedAsDataclass` included a
:func:`.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.

Fixes: #12952
Change-Id: I32f0adba00c32f5bf98fe2880dda1b96a7774d07

6 weeks agouse binary for psycopg2 and psycopg
Mike Bayer [Wed, 29 Oct 2025 17:17:47 +0000 (13:17 -0400)] 
use binary for psycopg2 and psycopg

Change-Id: Ieea8a90ca2dabd7675d9ce09e93c0399dd409f54

6 weeks agoMerge "Add docs for using Psycopg 3 connection pooling" into main
Michael Bayer [Wed, 29 Oct 2025 15:38:50 +0000 (15:38 +0000)] 
Merge "Add docs for using Psycopg 3 connection pooling" into main

6 weeks agofix session cursor result tip
Mike Bayer [Wed, 29 Oct 2025 12:08:03 +0000 (08:08 -0400)] 
fix session cursor result tip

in 2.0, we are usually not returning CursorResult for
Session.execute().

References: #12813
Change-Id: I19049b57790b5429ce7890c86e87b93c07a3f1d2

6 weeks agomissed yet another force dereference
Mike Bayer [Tue, 28 Oct 2025 23:41:10 +0000 (19:41 -0400)] 
missed yet another force dereference

Change-Id: I75204886b7a48a6148e47e18d28a0465f908c09d

6 weeks agofollowup to 368f5ac6668456 2
Mike Bayer [Tue, 28 Oct 2025 23:39:06 +0000 (19:39 -0400)] 
followup to 368f5ac6668456 2

Change-Id: I35e212aba32b2758a8bf6c01455f624910b4df17

6 weeks agoadditional followup to368f5ac6668456609cf5f862
Mike Bayer [Tue, 28 Oct 2025 22:44:55 +0000 (18:44 -0400)] 
additional followup to368f5ac6668456609cf5f862

Change-Id: I689a52c22efe8cff5ef80fe308673b2cb1fe7684

6 weeks agoMerge "try not to rely on GC working at all for tests" into main
Michael Bayer [Tue, 28 Oct 2025 22:32:34 +0000 (22:32 +0000)] 
Merge "try not to rely on GC working at all for tests" into main

6 weeks agoAdd docs for using Psycopg 3 connection pooling
chrispy [Fri, 24 Oct 2025 21:08:31 +0000 (17:08 -0400)] 
Add docs for using Psycopg 3 connection pooling

Updates documentation to describe how to use Psycopg 3 connection
pooling in SQLAlchemy. This is a follow-up to discussion #12522.

References: #12522
Closes: #12540
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/12540
Pull-request-sha: 8abbcb6e863deb6e0cf077d5fa780a2be5792931

Change-Id: I11ded6f82852f354f8371051c4b68fd7bdd01997

6 weeks agotry not to rely on GC working at all for tests
Mike Bayer [Tue, 28 Oct 2025 20:20:54 +0000 (16:20 -0400)] 
try not to rely on GC working at all for tests

GC seems to be working in fewer cases across different interpreters,
so add a new step to force an InstanceState to act as though
it got dereferenced, for those cases where we have del'ed the object,
done a gc collect, and we know it should not be reachable.

Change-Id: Ie97af1d5739f8d5a24aabe1296f14ce99ec1b0e5

6 weeks agoMerge "rewrite pool subsecond test to use mocking" into main
Michael Bayer [Tue, 28 Oct 2025 20:25:18 +0000 (20:25 +0000)] 
Merge "rewrite pool subsecond test to use mocking" into main

6 weeks agoset nox min version only for newer sys python
Mike Bayer [Tue, 28 Oct 2025 19:22:45 +0000 (15:22 -0400)] 
set nox min version only for newer sys python

The min version here fails on github actions because the runners
there use the single version of python for the install, and the newer
nox is not available on older pythons like 3.7.

We probably dont need the min version anyway, as since we have just
switched to venv in 5e62ea65167c, the misinterpretation of
"python3.14t" doesn't seem to happen anyway.  however, all versions
of nox seem willing to install a 3.14t interpreter when 3.14 is
requested, and a 3.14t is sooner in the path.  does not seem to
happen the other way around though (e.g. when 3.14t is requested,
it does not use a 3.14)

Anyway, for better predictability leave a min nox version in place
where we can do so for now.

Change-Id: I93a2c2e71798f5a75d71cc63de54750ec13975a1

6 weeks agouse the nox venv backend
Mike Bayer [Tue, 28 Oct 2025 18:06:14 +0000 (14:06 -0400)] 
use the nox venv backend

This backend seems to run from the start against the resolved
interpreter, which we want.   The virtualenv option, which is
the default, has the problem indicated at [1].

[1] https://github.com/wntrblm/nox/issues/1021

Change-Id: Ic10317c603e0556676b16ad314fe6e79ba9d0476

6 weeks agorewrite pool subsecond test to use mocking
Mike Bayer [Tue, 28 Oct 2025 14:03:09 +0000 (10:03 -0400)] 
rewrite pool subsecond test to use mocking

the timing here is too sensitive to play out reliably
on CI machines particularly free threaded, so mock the time()
callable instead and ensure with subsecond clock intervals
we do the right math

Change-Id: Icc203ae2298eb4b64e3b45f063811e9527278d0c

6 weeks agomore cache_key coverage
Mike Bayer [Mon, 27 Oct 2025 16:18:56 +0000 (12:18 -0400)] 
more cache_key coverage

Change-Id: I68ed84c1617b4d15b0103cf4a3debd1da05c6c97

6 weeks agofix source list for coverage
Mike Bayer [Mon, 27 Oct 2025 15:59:54 +0000 (11:59 -0400)] 
fix source list for coverage

Change-Id: Ie995efd2e20bde2c687d33d757e7b3b2e8a719c0

6 weeks agoMerge "try to improve coverage a bit" into main
Michael Bayer [Mon, 27 Oct 2025 15:49:29 +0000 (15:49 +0000)] 
Merge "try to improve coverage a bit" into main

6 weeks agoensure PYTHONPATH is blanked out
Mike Bayer [Mon, 27 Oct 2025 15:12:44 +0000 (11:12 -0400)] 
ensure PYTHONPATH is blanked out

this is in the tox.ini file also.  without it, the tests
run from my local ./lib/ when I set PYTHONPATH on the
outside

Change-Id: I1ec88edc0e1aeafbfa95054ec4ccb30bcb22d55f

6 weeks agotry to improve coverage a bit
Mike Bayer [Mon, 27 Oct 2025 14:56:49 +0000 (10:56 -0400)] 
try to improve coverage a bit

use pyproject.toml so the options are safe from "rm .coverage*"
types of commands

omit some files

add test coverage for a big section of cache-key

Change-Id: Ia540c632d91ec09284e187e3edeb8ccf0214e1a6

6 weeks agorepair / modernize binary literal round trip test
Mike Bayer [Sun, 26 Oct 2025 13:30:54 +0000 (09:30 -0400)] 
repair / modernize binary literal round trip test

update this test to use modern literal round trip
now that execute_compiled is gone

Fixes: #12940
Change-Id: I587dc6845fa8ff078baf3f6e08e54ce6cec84630

7 weeks agoMerge "Support for Create Table As" into main
Michael Bayer [Sat, 25 Oct 2025 20:18:32 +0000 (20:18 +0000)] 
Merge "Support for Create Table As" into main

7 weeks agoSupport for Create Table As
Greg Jarzab [Tue, 23 Sep 2025 13:08:46 +0000 (09:08 -0400)] 
Support for Create Table As

Added support for the SQL ``CREATE TABLE ... AS SELECT`` construct via the
new :class:`_sql.CreateTableAs` DDL construct and the
:meth:`_sql.SelectBase.into` method. The new construct allows creating a
table directly from the results of a SELECT statement, with support for
options such as ``TEMPORARY`` and ``IF NOT EXISTS`` where supported by the
target database.  Pull request courtesy Greg Jarzab.

Fixes: #4950
Closes: #12860
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/12860
Pull-request-sha: 7de8a109b892fd91222ce2f59c388ca275021ddb

Change-Id: Id9c8e4a3c520ffc61de1e48e331b6220e3d52fc9

7 weeks agotry to stop greenlet from building on a t machine
Mike Bayer [Fri, 24 Oct 2025 23:35:55 +0000 (19:35 -0400)] 
try to stop greenlet from building on a t machine

Change-Id: I21b4cbe056cf8d7265a5c15f793c6e4769f2c831

7 weeks agopostfix of I5f0fe800e31aac052926cebe9206763eef9a804c
Federico Caselli [Fri, 24 Oct 2025 21:54:48 +0000 (23:54 +0200)] 
postfix of I5f0fe800e31aac052926cebe9206763eef9a804c

Change-Id: Ic007a5bd842207a2c5a56374953e48c6acc7b254

7 weeks agoMerge "proposal: remove _execute_compiled()" into main
Michael Bayer [Fri, 24 Oct 2025 21:49:22 +0000 (21:49 +0000)] 
Merge "proposal: remove _execute_compiled()" into main

7 weeks agoAllow non-integer RANGE in OVER
Violet Folino Gallo [Thu, 31 Jul 2025 08:05:36 +0000 (04:05 -0400)] 
Allow non-integer RANGE in OVER

Updated the :func:`_sql.over` clause to allow non-integer values in
:paramref:`_sql.over.range_` clause. Previously, only integer values
were allowed and any other values would lead to a failure.
To specify a non-integer value, use the new :class:`_sql.FrameClause`
construct along with the new :class:`_sql.FrameClauseType` enum to specify
the frame boundaries.

Fixes #12596.
Closes: #12695
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/12695
Pull-request-sha: 8063cec65d1e7ad5d640bf689c01079e2d8c89ae

Change-Id: I248a938f6502d72555c005d86791c992822117d4

7 weeks agoMerge "improve sqlite reflection regex for unusual names/formats" into main
Michael Bayer [Fri, 24 Oct 2025 14:57:33 +0000 (14:57 +0000)] 
Merge "improve sqlite reflection regex for unusual names/formats" into main

7 weeks agoimprove sqlite reflection regex for unusual names/formats
Mike Bayer [Sat, 18 Oct 2025 20:43:22 +0000 (16:43 -0400)] 
improve sqlite reflection regex for unusual names/formats

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.

Fixes: #12924
Change-Id: I0390ac334c98e934c7e0353f47c9f43204791af5

7 weeks agoproposal: remove _execute_compiled()
Mike Bayer [Tue, 5 Mar 2024 21:28:51 +0000 (16:28 -0500)] 
proposal: remove _execute_compiled()

this isn't used internally and only allows execute(stmt.compile())
to work, which is not something I want to support.

Since people are definitely using this [1] we might want to think about
either deprectation or having a recipe for people who really want
to still do this

[1] https://github.com/sqlalchemy/sqlalchemy/discussions/11108?converting=1

Change-Id: I5f0fe800e31aac052926cebe9206763eef9a804c

7 weeks agoensure explicit left side considered for ON clause in join_from
Mike Bayer [Tue, 21 Oct 2025 12:48:12 +0000 (08:48 -0400)] 
ensure explicit left side considered for ON clause in join_from

Fixed an issue in :meth:`_sql.Select.join_from` where the join condition
between the left and right tables specified in the method call could be
incorrectly determined based on an intermediate table already present in
the FROM clause, rather than matching the foreign keys between the
immediate left and right arguments. The join condition is now determined by
matching primary keys between the two tables explicitly passed to
:meth:`_sql.Select.join_from`, ensuring consistent and predictable join
behavior regardless of the order of join operations or other tables present
in the query.  The fix is applied to both the Core and ORM implementations
of :meth:`_sql.Select.join_from`.

Fixes: #12931
Change-Id: Id457d441ee8a1bd64a002e57a9dcfd6fc56ff15e

7 weeks agoturn on plain 3.14 for GH actions
Mike Bayer [Mon, 20 Oct 2025 21:04:30 +0000 (17:04 -0400)] 
turn on plain 3.14 for GH actions

which we are assuming is released by now

there should also be 3.14t plain

Change-Id: I045984fa30531818cf51cac96aefd6db411a040a

7 weeks agoFix missing back_populates in Note.item relationship in example code (#12925)
krave1986 [Mon, 20 Oct 2025 20:06:31 +0000 (04:06 +0800)] 
Fix missing back_populates in Note.item relationship in example code (#12925)

Without back_populates, the subsequent code would not automatically populate Item.notes or generate the key, which contradicts what the documentation intends to demonstrate.