This is an automated email from the ASF dual-hosted git repository.
shahar1 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 4fe401cd89e Switch the default async Postgres driver from asyncpg to
psycopg3 (provider) (#69089)
4fe401cd89e is described below
commit 4fe401cd89eb2c68124f079734a6330643c5e66c
Author: Dev-iL <[email protected]>
AuthorDate: Sat Jul 4 17:25:47 2026 +0300
Switch the default async Postgres driver from asyncpg to psycopg3
(provider) (#69089)
---
providers/postgres/README.rst | 5 +++--
providers/postgres/docs/changelog.rst | 15 +++++++++++++++
providers/postgres/docs/index.rst | 3 ++-
providers/postgres/pyproject.toml | 13 ++++++++-----
.../src/airflow/providers/postgres/hooks/postgres.py | 20 ++------------------
uv.lock | 19 ++++++++++---------
6 files changed, 40 insertions(+), 35 deletions(-)
diff --git a/providers/postgres/README.rst b/providers/postgres/README.rst
index 3f8b6686211..4e6f61a59f5 100644
--- a/providers/postgres/README.rst
+++ b/providers/postgres/README.rst
@@ -58,7 +58,8 @@ PIP package Version required
``apache-airflow-providers-common-sql`` ``>=1.32.0``
``psycopg2-binary`` ``>=2.9.9; python_version <
"3.13"``
``psycopg2-binary`` ``>=2.9.10; python_version >=
"3.13"``
-``asyncpg`` ``>=0.30.0``
+``psycopg[binary]`` ``>=3.2.9; python_version <
"3.14"``
+``psycopg[binary]`` ``>=3.3.3; python_version >=
"3.14"``
==========================================
======================================
Optional cross provider package dependencies
@@ -89,11 +90,11 @@ Optional dependencies
Extra Dependencies
===================
============================================================================================================================================================
``amazon`` ``apache-airflow-providers-amazon>=2.6.0``
+``asyncpg`` ``asyncpg>=0.30.0``
``microsoft.azure`` ``apache-airflow-providers-microsoft-azure>=12.8.0``
``openlineage`` ``apache-airflow-providers-openlineage``
``pandas`` ``pandas>=2.1.2; python_version <"3.13"``,
``pandas>=2.2.3; python_version >="3.13" and python_version <"3.14"``,
``pandas>=2.3.3; python_version >="3.14"``
``polars`` ``polars>=1.26.0``
-``psycopg`` ``psycopg[binary]>=3.2.9; python_version < '3.14'``,
``psycopg[binary]>=3.3.3; python_version >= '3.14'``
``sqlalchemy`` ``sqlalchemy>=1.4.54``
===================
============================================================================================================================================================
diff --git a/providers/postgres/docs/changelog.rst
b/providers/postgres/docs/changelog.rst
index 934ded27a23..eff74f32684 100644
--- a/providers/postgres/docs/changelog.rst
+++ b/providers/postgres/docs/changelog.rst
@@ -27,6 +27,21 @@
Changelog
---------
+
+Breaking changes
+~~~~~~~~~~~~~~~~
+
+.. note::
+ The default async metadata-database driver is now ``psycopg`` (psycopg3),
+ which is installed by default in place of ``asyncpg``. As a result, the
+ ``[psycopg]`` optional extra was removed and ``[asyncpg]`` was added.
+
+ Starting with Airflow 3.4.0, the default derived async connection URL
changes from
+ ``postgresql+asyncpg://`` to ``postgresql+psycopg_async://``, which is
safe behind
+ transaction-mode PgBouncer with no extra configuration. To keep using
asyncpg, install
+ ``apache-airflow-providers-postgres[asyncpg]`` and set
+ ``[database] sql_alchemy_conn_async = postgresql+asyncpg://...``
explicitly.
+
6.8.0
.....
diff --git a/providers/postgres/docs/index.rst
b/providers/postgres/docs/index.rst
index eef9e8e5eee..b10aa40df76 100644
--- a/providers/postgres/docs/index.rst
+++ b/providers/postgres/docs/index.rst
@@ -106,7 +106,8 @@ PIP package Version required
``apache-airflow-providers-common-sql`` ``>=1.32.0``
``psycopg2-binary`` ``>=2.9.9; python_version <
"3.13"``
``psycopg2-binary`` ``>=2.9.10; python_version >=
"3.13"``
-``asyncpg`` ``>=0.30.0``
+``psycopg[binary]`` ``>=3.2.9; python_version <
"3.14"``
+``psycopg[binary]`` ``>=3.3.3; python_version >=
"3.14"``
==========================================
======================================
Optional cross provider package dependencies
diff --git a/providers/postgres/pyproject.toml
b/providers/postgres/pyproject.toml
index 83b2b92f610..8adda0b5780 100644
--- a/providers/postgres/pyproject.toml
+++ b/providers/postgres/pyproject.toml
@@ -62,9 +62,12 @@ dependencies = [
"apache-airflow>=2.11.0",
"apache-airflow-providers-common-compat>=1.12.0",
"apache-airflow-providers-common-sql>=1.32.0",
+ # psycopg2 remains the sync driver for now; its removal and the sync
migration to
+ # psycopg3 are tracked at https://github.com/apache/airflow/issues/68453
"psycopg2-binary>=2.9.9; python_version < '3.13'",
"psycopg2-binary>=2.9.10; python_version >= '3.13'",
- "asyncpg>=0.30.0",
+ "psycopg[binary]>=3.2.9; python_version < '3.14'",
+ "psycopg[binary]>=3.3.3; python_version >= '3.14'",
]
# The optional dependencies should be modified in place in the generated file
@@ -73,6 +76,9 @@ dependencies = [
"amazon" = [
"apache-airflow-providers-amazon>=2.6.0",
]
+"asyncpg" = [
+ "asyncpg>=0.30.0",
+]
"microsoft.azure" = [
"apache-airflow-providers-microsoft-azure>=12.8.0"
]
@@ -87,10 +93,6 @@ dependencies = [
"polars" = [
"polars>=1.26.0"
]
-"psycopg" = [
- "psycopg[binary]>=3.2.9; python_version < '3.14'",
- "psycopg[binary]>=3.3.3; python_version >= '3.14'",
-]
"sqlalchemy" = [
"sqlalchemy>=1.4.54"
]
@@ -108,6 +110,7 @@ dev = [
# Additional devel dependencies (do not remove this line and add extra
development dependencies)
"apache-airflow-providers-common-sql[pandas]",
"apache-airflow-providers-common-sql[polars]",
+ "apache-airflow-providers-postgres[asyncpg]",
"apache-airflow-providers-postgres[sqlalchemy]"
]
diff --git
a/providers/postgres/src/airflow/providers/postgres/hooks/postgres.py
b/providers/postgres/src/airflow/providers/postgres/hooks/postgres.py
index 77ca0537b93..be6519ddade 100644
--- a/providers/postgres/src/airflow/providers/postgres/hooks/postgres.py
+++ b/providers/postgres/src/airflow/providers/postgres/hooks/postgres.py
@@ -70,30 +70,14 @@ if TYPE_CHECKING:
class CompatConnection(Protocol):
- """Protocol for type hinting psycopg2 and psycopg3 connection objects."""
+ """Protocol for the common interface shared by psycopg2 and psycopg3
connection objects."""
def cursor(self, *args, **kwargs) -> Any: ...
def commit(self) -> None: ...
def close(self) -> None: ...
-
- # Context manager support
- def __enter__(self) -> CompatConnection: ...
+ def __enter__(self) -> Any: ...
def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None: ...
- # Common properties
- @property
- def notices(self) -> list[Any]: ...
-
- # psycopg3 specific (optional)
- @property
- def adapters(self) -> Any: ...
-
- @property
- def row_factory(self) -> Any: ...
-
- # Optional method for psycopg3
- def add_notice_handler(self, handler: Any) -> None: ...
-
class PostgresHook(DbApiHook):
"""
diff --git a/uv.lock b/uv.lock
index bf13cb8afb9..11bbace1114 100644
--- a/uv.lock
+++ b/uv.lock
@@ -7150,7 +7150,7 @@ dependencies = [
{ name = "apache-airflow" },
{ name = "apache-airflow-providers-common-compat" },
{ name = "apache-airflow-providers-common-sql" },
- { name = "asyncpg" },
+ { name = "psycopg", extra = ["binary"] },
{ name = "psycopg2-binary" },
]
@@ -7158,6 +7158,9 @@ dependencies = [
amazon = [
{ name = "apache-airflow-providers-amazon" },
]
+asyncpg = [
+ { name = "asyncpg" },
+]
microsoft-azure = [
{ name = "apache-airflow-providers-microsoft-azure" },
]
@@ -7170,9 +7173,6 @@ pandas = [
polars = [
{ name = "polars" },
]
-psycopg = [
- { name = "psycopg", extra = ["binary"] },
-]
sqlalchemy = [
{ name = "sqlalchemy" },
]
@@ -7186,7 +7186,7 @@ dev = [
{ name = "apache-airflow-providers-common-sql", extra = ["pandas",
"polars"] },
{ name = "apache-airflow-providers-microsoft-azure" },
{ name = "apache-airflow-providers-openlineage" },
- { name = "apache-airflow-providers-postgres", extra = ["sqlalchemy"] },
+ { name = "apache-airflow-providers-postgres", extra = ["asyncpg",
"sqlalchemy"] },
{ name = "apache-airflow-task-sdk" },
]
docs = [
@@ -7201,18 +7201,18 @@ requires-dist = [
{ name = "apache-airflow-providers-common-sql", editable =
"providers/common/sql" },
{ name = "apache-airflow-providers-microsoft-azure", marker = "extra ==
'microsoft-azure'", editable = "providers/microsoft/azure" },
{ name = "apache-airflow-providers-openlineage", marker = "extra ==
'openlineage'", editable = "providers/openlineage" },
- { name = "asyncpg", specifier = ">=0.30.0" },
+ { name = "asyncpg", marker = "extra == 'asyncpg'", specifier = ">=0.30.0"
},
{ name = "pandas", marker = "python_full_version == '3.13.*' and extra ==
'pandas'", specifier = ">=2.2.3" },
{ name = "pandas", marker = "python_full_version < '3.13' and extra ==
'pandas'", specifier = ">=2.1.2" },
{ name = "pandas", marker = "python_full_version >= '3.14' and extra ==
'pandas'", specifier = ">=2.3.3" },
{ name = "polars", marker = "extra == 'polars'", specifier = ">=1.26.0" },
- { name = "psycopg", extras = ["binary"], marker = "python_full_version >=
'3.14' and extra == 'psycopg'", specifier = ">=3.3.3" },
- { name = "psycopg", extras = ["binary"], marker = "python_full_version <
'3.14' and extra == 'psycopg'", specifier = ">=3.2.9" },
+ { name = "psycopg", extras = ["binary"], marker = "python_full_version <
'3.14'", specifier = ">=3.2.9" },
+ { name = "psycopg", extras = ["binary"], marker = "python_full_version >=
'3.14'", specifier = ">=3.3.3" },
{ name = "psycopg2-binary", marker = "python_full_version < '3.13'",
specifier = ">=2.9.9" },
{ name = "psycopg2-binary", marker = "python_full_version >= '3.13'",
specifier = ">=2.9.10" },
{ name = "sqlalchemy", marker = "extra == 'sqlalchemy'", specifier =
">=1.4.54" },
]
-provides-extras = ["amazon", "microsoft-azure", "openlineage", "pandas",
"polars", "psycopg", "sqlalchemy"]
+provides-extras = ["amazon", "asyncpg", "microsoft-azure", "openlineage",
"pandas", "polars", "sqlalchemy"]
[package.metadata.requires-dev]
dev = [
@@ -7225,6 +7225,7 @@ dev = [
{ name = "apache-airflow-providers-common-sql", extras = ["polars"],
editable = "providers/common/sql" },
{ name = "apache-airflow-providers-microsoft-azure", editable =
"providers/microsoft/azure" },
{ name = "apache-airflow-providers-openlineage", editable =
"providers/openlineage" },
+ { name = "apache-airflow-providers-postgres", extras = ["asyncpg"],
editable = "providers/postgres" },
{ name = "apache-airflow-providers-postgres", extras = ["sqlalchemy"],
editable = "providers/postgres" },
{ name = "apache-airflow-task-sdk", editable = "task-sdk" },
]