seanmuth commented on code in PR #68305:
URL: https://github.com/apache/airflow/pull/68305#discussion_r3383662898
##########
providers/hashicorp/src/airflow/providers/hashicorp/secrets/vault.py:
##########
@@ -237,19 +237,27 @@ def get_connection(self, conn_id: str, team_name: str |
None = None) -> Connecti
:return: A Connection object constructed from Vault data
"""
- # The Connection needs to be locally imported because otherwise we get
into cyclic import
- # problems when instantiating the backend during configuration
- from airflow.models.connection import Connection
+ # Use the compat SDK Connection (Pydantic in Airflow 3, SQLAlchemy in
Airflow 2) to avoid
+ # triggering SQLAlchemy mapper initialization for unrelated models
(e.g. DagModel) in
+ # task-execution subprocesses such as PythonVirtualenvOperator.
+ from airflow.providers.common.compat.sdk import Connection
response = self._get_team_or_global_secret(self.connections_path,
team_name, conn_id)
if response is None:
return None
uri = response.get("conn_uri")
if uri:
- return Connection(conn_id, uri=uri)
+ # In Airflow 3 the SDK Connection's __init__ is keyword-only and
attrs-generated;
+ # uri= is not in the attrs fields so we use the classmethod
directly.
+ # In Airflow 2 the SQLAlchemy Connection accepts uri= in its
__init__.
+ from airflow.providers.common.compat.version_compat import
AIRFLOW_V_3_0_PLUS
- return Connection(conn_id, **response)
+ if AIRFLOW_V_3_0_PLUS:
+ return Connection.from_uri(uri, conn_id=conn_id) # type:
ignore[attr-defined]
Review Comment:
Good catch — switched to `hasattr(Connection, "from_uri")` matching the
pattern in `_deserialize_connection_value` in
`airflow_shared/secrets_backend/base.py`. Added a comment noting that
`conn_uri`-style secrets remain broken on Airflow 3.0/3.1 (pre-existing, not
introduced here).
---
Drafted-by: Claude Code (Sonnet 4.6); reviewed by @seanmuth before posting
##########
providers/hashicorp/src/airflow/providers/hashicorp/secrets/vault.py:
##########
@@ -237,19 +237,27 @@ def get_connection(self, conn_id: str, team_name: str |
None = None) -> Connecti
:return: A Connection object constructed from Vault data
"""
- # The Connection needs to be locally imported because otherwise we get
into cyclic import
- # problems when instantiating the backend during configuration
- from airflow.models.connection import Connection
+ # Use the compat SDK Connection (Pydantic in Airflow 3, SQLAlchemy in
Airflow 2) to avoid
+ # triggering SQLAlchemy mapper initialization for unrelated models
(e.g. DagModel) in
+ # task-execution subprocesses such as PythonVirtualenvOperator.
+ from airflow.providers.common.compat.sdk import Connection
response = self._get_team_or_global_secret(self.connections_path,
team_name, conn_id)
if response is None:
return None
uri = response.get("conn_uri")
if uri:
- return Connection(conn_id, uri=uri)
+ # In Airflow 3 the SDK Connection's __init__ is keyword-only and
attrs-generated;
+ # uri= is not in the attrs fields so we use the classmethod
directly.
+ # In Airflow 2 the SQLAlchemy Connection accepts uri= in its
__init__.
+ from airflow.providers.common.compat.version_compat import
AIRFLOW_V_3_0_PLUS
Review Comment:
Agreed — removed the `AIRFLOW_V_3_0_PLUS` import entirely by switching to
`hasattr`, so there's nothing left to move.
---
Drafted-by: Claude Code (Sonnet 4.6); reviewed by @seanmuth before posting
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]