This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new a8770ba5668 Update SQLAlchemy documentation links from 1.4 to 2.0
(#69200)
a8770ba5668 is described below
commit a8770ba566845076a3d5d6adc723776cb0798747
Author: Ashley Huang <[email protected]>
AuthorDate: Wed Jul 1 05:08:10 2026 -0700
Update SQLAlchemy documentation links from 1.4 to 2.0 (#69200)
The SQLAlchemy 1.4 docs are frozen at an old version; the project has
moved to 2.0. Point all references at the current docs so readers land
on maintained content instead of a stale release.
---
airflow-core/docs/howto/set-up-database.rst | 12 ++++++------
airflow-core/src/airflow/assets/manager.py | 2 +-
airflow-core/src/airflow/models/base.py | 2 +-
.../sqlite/src/airflow/providers/sqlite/hooks/sqlite.py | 4 ++--
4 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/airflow-core/docs/howto/set-up-database.rst
b/airflow-core/docs/howto/set-up-database.rst
index 955156c262f..43cafdb22c4 100644
--- a/airflow-core/docs/howto/set-up-database.rst
+++ b/airflow-core/docs/howto/set-up-database.rst
@@ -20,7 +20,7 @@
Set up a Database Backend
=========================
-Airflow was built to interact with its metadata using `SqlAlchemy
<https://docs.sqlalchemy.org/en/14/>`__.
+Airflow was built to interact with its metadata using `SqlAlchemy
<https://docs.sqlalchemy.org/en/20/>`__.
The document below describes the database engine configurations, the necessary
changes to their configuration to be used with Airflow, as well as changes to
the Airflow configurations to connect to these databases.
@@ -66,7 +66,7 @@ the example below.
$ airflow config get-value database sql_alchemy_conn
sqlite:////tmp/airflow/airflow.db
-The exact format description is described in the SQLAlchemy documentation, see
`Database Urls <https://docs.sqlalchemy.org/en/14/core/engines.html>`__. We
will also show you some examples below.
+The exact format description is described in the SQLAlchemy documentation, see
`Database Urls <https://docs.sqlalchemy.org/en/20/core/engines.html>`__. We
will also show you some examples below.
Setting up a SQLite Database
----------------------------
@@ -198,7 +198,7 @@ in the Postgres documentation to learn more.
If you cannot change the prefix of your URL immediately, Airflow continues
to work with SQLAlchemy
1.3 and you can downgrade SQLAlchemy, but we recommend to update the prefix.
- Details in the `SQLAlchemy Changelog
<https://docs.sqlalchemy.org/en/14/changelog/changelog_14.html#change-3687655465c25a39b968b4f5f6e9170b>`_.
+ Details in the `SQLAlchemy Changelog
<https://docs.sqlalchemy.org/en/20/changelog/changelog_14.html#change-3687655465c25a39b968b4f5f6e9170b>`_.
We recommend using the ``psycopg2`` driver and specifying it in your
SqlAlchemy connection string.
@@ -218,7 +218,7 @@ If you use a current Postgres user with custom search_path,
search_path can be c
ALTER USER airflow_user SET search_path = public;
-For more information regarding setup of the PostgreSQL connection, see
`PostgreSQL dialect
<https://docs.sqlalchemy.org/en/14/dialects/postgresql.html>`__ in SQLAlchemy
documentation.
+For more information regarding setup of the PostgreSQL connection, see
`PostgreSQL dialect
<https://docs.sqlalchemy.org/en/20/dialects/postgresql.html>`__ in SQLAlchemy
documentation.
.. note::
@@ -307,7 +307,7 @@ We recommend using the ``mysqlclient`` driver and
specifying it in your SqlAlche
The integration of MySQL backend has only been validated using the
``mysqlclient`` driver
during Apache Airflow's continuous integration (CI) process.
-If you want to use other drivers visit the `MySQL Dialect
<https://docs.sqlalchemy.org/en/14/dialects/mysql.html>`__ in SQLAlchemy
documentation for more information regarding download
+If you want to use other drivers visit the `MySQL Dialect
<https://docs.sqlalchemy.org/en/20/dialects/mysql.html>`__ in SQLAlchemy
documentation for more information regarding download
and setup of the SqlAlchemy connection.
In addition, you also should pay particular attention to MySQL's encoding.
Although the ``utf8mb4`` character set is more and more popular for MySQL
(actually, ``utf8mb4`` becomes default character set in MySQL8.0), using the
``utf8mb4`` encoding requires additional setting in Airflow 2+ (See more
details in `#7570 <https://github.com/apache/airflow/pull/7570>`__.). If you
use ``utf8mb4`` as character set, you should also set
``sql_engine_collation_for_ids=utf8mb3_bin``.
@@ -454,7 +454,7 @@ engine configuration).
- Suitable for non-production environments like staging systems.
You can do it with ``echo=True`` as sqlalchemy engine configuration as
explained in the
-`SQLAlchemy logging documentation
<https://docs.sqlalchemy.org/en/14/core/engines.html#configuring-logging>`_.
+`SQLAlchemy logging documentation
<https://docs.sqlalchemy.org/en/20/core/engines.html#configuring-logging>`_.
Use :ref:`config:database__sql_alchemy_engine_args` configuration parameter to
set echo arg to True.
diff --git a/airflow-core/src/airflow/assets/manager.py
b/airflow-core/src/airflow/assets/manager.py
index d3399cc6e00..c3491574e91 100644
--- a/airflow-core/src/airflow/assets/manager.py
+++ b/airflow-core/src/airflow/assets/manager.py
@@ -795,7 +795,7 @@ class AssetManager(LoggingMixin):
def _queue_dagrun_if_needed(dag: DagModel) -> str | None:
item = AssetDagRunQueue(target_dag_id=dag.dag_id,
asset_id=asset_id)
# Don't error whole transaction when a single RunQueue item
conflicts.
- #
https://docs.sqlalchemy.org/en/14/orm/session_transaction.html#using-savepoint
+ #
https://docs.sqlalchemy.org/en/20/orm/session_transaction.html#using-savepoint
try:
with session.begin_nested():
session.merge(item)
diff --git a/airflow-core/src/airflow/models/base.py
b/airflow-core/src/airflow/models/base.py
index 19bdae9d693..1c7af7b275a 100644
--- a/airflow-core/src/airflow/models/base.py
+++ b/airflow-core/src/airflow/models/base.py
@@ -28,7 +28,7 @@ SQL_ALCHEMY_SCHEMA = conf.get("database",
"SQL_ALCHEMY_SCHEMA")
# For more information about what the tokens in the naming convention
# below mean, see:
-#
https://docs.sqlalchemy.org/en/14/core/metadata.html#sqlalchemy.schema.MetaData.params.naming_convention
+#
https://docs.sqlalchemy.org/en/20/core/metadata.html#sqlalchemy.schema.MetaData.params.naming_convention
naming_convention = {
"ix": "idx_%(column_0_N_label)s",
"uq": "%(table_name)s_%(column_0_N_name)s_uq",
diff --git a/providers/sqlite/src/airflow/providers/sqlite/hooks/sqlite.py
b/providers/sqlite/src/airflow/providers/sqlite/hooks/sqlite.py
index 4647a4b086e..99030b2067e 100644
--- a/providers/sqlite/src/airflow/providers/sqlite/hooks/sqlite.py
+++ b/providers/sqlite/src/airflow/providers/sqlite/hooks/sqlite.py
@@ -39,7 +39,7 @@ class SqliteHook(DbApiHook):
"""Return SQLite connection object."""
sqlalchemy_uri = self.get_uri()
# The sqlite3 connection does not use the sqlite scheme.
- # See
https://docs.sqlalchemy.org/en/14/dialects/sqlite.html#uri-connections for
details.
+ # See
https://docs.sqlalchemy.org/en/20/dialects/sqlite.html#uri-connections for
details.
sqlite_uri = sqlalchemy_uri.replace("sqlite:///", "file:")
conn = sqlite3.connect(sqlite_uri, uri=True)
return conn
@@ -51,6 +51,6 @@ class SqliteHook(DbApiHook):
# For sqlite, there is no schema in the connection URI. So we need to
drop the trailing slash.
airflow_sqlite_uri = airflow_uri.replace("/?", "?")
# The sqlite connection has one more slash for path specification.
- # See
https://docs.sqlalchemy.org/en/14/dialects/sqlite.html#connect-strings for
details.
+ # See
https://docs.sqlalchemy.org/en/20/dialects/sqlite.html#connect-strings for
details.
sqlalchemy_uri = airflow_sqlite_uri.replace("sqlite://", "sqlite:///")
return sqlalchemy_uri