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 9b1be609c46 Add SQLAlchemy dependency to Exasol provider (#59902)
(#59915)
9b1be609c46 is described below
commit 9b1be609c46f9932f3b5b3c627fac4706b3d9cb5
Author: Jason K Hall <[email protected]>
AuthorDate: Wed Dec 31 16:35:56 2025 -0700
Add SQLAlchemy dependency to Exasol provider (#59902) (#59915)
* Fix: Make sqlalchemy optional in Exasol provider
* Update providers/exasol/pyproject.toml
Co-authored-by: Jarek Potiuk <[email protected]>
---------
Co-authored-by: Jarek Potiuk <[email protected]>
---
providers/exasol/pyproject.toml | 7 +++++++
.../exasol/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 2c41a954f36..78478aa0f09 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.49",
+]
+
[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 417ee56b1de..cf2aa1629c9 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 @@ from typing import TYPE_CHECKING, Any, TypeVar, overload
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 @@ class ExasolHook(DbApiHook):
: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 @@ class ExasolHook(DbApiHook):
: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(