From f4391e6586c2f8cc6b10125050aa69a9d56b4ba0 Mon Sep 17 00:00:00 2001 From: jkhall81 Date: Mon, 29 Dec 2025 18:45:07 -0700 Subject: [PATCH 1/2] Fix: Make sqlalchemy optional in Exasol provider --- providers/exasol/pyproject.toml | 7 +++++++ .../src/airflow/providers/exasol/hooks/exasol.py | 16 ++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/providers/exasol/pyproject.toml b/providers/exasol/pyproject.toml index 2c41a954f3600..4f69f360091f4 100644 --- a/providers/exasol/pyproject.toml +++ b/providers/exasol/pyproject.toml @@ -65,6 +65,13 @@ dependencies = [ 'pandas>=2.2.3; python_version >="3.13"', ] +# The optional dependencies should be modified in place in the generated file +# Any change in the dependencies is preserved when the file is regenerated +[project.optional-dependencies] +sqlalchemy = [ + "sqlalchemy>=1.4.0", +] + [dependency-groups] dev = [ "apache-airflow", diff --git a/providers/exasol/src/airflow/providers/exasol/hooks/exasol.py b/providers/exasol/src/airflow/providers/exasol/hooks/exasol.py index 417ee56b1de17..cf2aa1629c96c 100644 --- a/providers/exasol/src/airflow/providers/exasol/hooks/exasol.py +++ b/providers/exasol/src/airflow/providers/exasol/hooks/exasol.py @@ -24,9 +24,13 @@ import pyexasol from deprecated import deprecated from pyexasol import ExaConnection, ExaStatement -from sqlalchemy.engine import URL -from airflow.exceptions import AirflowProviderDeprecationWarning +try: + from sqlalchemy.engine import URL +except ImportError: + URL = None + +from airflow.exceptions import AirflowOptionalProviderFeatureException, AirflowProviderDeprecationWarning from airflow.providers.common.sql.hooks.handlers import return_single_query_results from airflow.providers.common.sql.hooks.sql import DbApiHook @@ -96,6 +100,10 @@ def sqlalchemy_url(self) -> URL: :return: the extracted sqlalchemy.engine.URL object. """ + if URL is None: + raise AirflowOptionalProviderFeatureException( + "The 'sqlalchemy' library is required to use 'sqlalchemy_url'." + ) connection = self.connection query = connection.extra_dejson query = {k: v for k, v in query.items() if k.lower() != "sqlalchemy_scheme"} @@ -115,6 +123,10 @@ def get_uri(self) -> str: :return: the extracted uri. """ + if URL is None: + raise AirflowOptionalProviderFeatureException( + "The 'sqlalchemy' library is required to render the connection URI." + ) return self.sqlalchemy_url.render_as_string(hide_password=False) def _get_pandas_df( From 5d052625088d20602b64c08f45d22e531c88aade Mon Sep 17 00:00:00 2001 From: Jason K Hall <106277735+Jkhall81@users.noreply.github.com> Date: Tue, 30 Dec 2025 05:57:37 -0700 Subject: [PATCH 2/2] Update providers/exasol/pyproject.toml Co-authored-by: Jarek Potiuk --- providers/exasol/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/providers/exasol/pyproject.toml b/providers/exasol/pyproject.toml index 4f69f360091f4..78478aa0f0988 100644 --- a/providers/exasol/pyproject.toml +++ b/providers/exasol/pyproject.toml @@ -69,7 +69,7 @@ dependencies = [ # Any change in the dependencies is preserved when the file is regenerated [project.optional-dependencies] sqlalchemy = [ - "sqlalchemy>=1.4.0", + "sqlalchemy>=1.4.49", ] [dependency-groups]