Skip to content

Commit c680d8e

Browse files
authored
Made sqlalchemy dependency optional for amazon provider (#59941)
* Made sqlalchemy dependency optional for amazon provider * Prek formatting
1 parent efd458b commit c680d8e

File tree

3 files changed

+32
-4
lines changed

3 files changed

+32
-4
lines changed

providers/amazon/pyproject.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,9 @@ dependencies = [
151151
"common.messaging" = [
152152
"apache-airflow-providers-common-messaging>=2.0.0"
153153
]
154+
"sqlalchemy" = [
155+
"sqlalchemy>=1.4.49",
156+
]
154157

155158
[dependency-groups]
156159
dev = [

providers/amazon/src/airflow/providers/amazon/aws/hooks/athena_sql.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,11 @@
2121
from typing import TYPE_CHECKING, Any
2222

2323
import pyathena
24-
from sqlalchemy.engine.url import URL
24+
25+
try:
26+
from sqlalchemy.engine.url import URL
27+
except ImportError:
28+
URL = None
2529

2630
from airflow.providers.amazon.aws.hooks.base_aws import AwsBaseHook
2731
from airflow.providers.amazon.aws.utils.connection_wrapper import AwsConnectionWrapper
@@ -152,9 +156,15 @@ def _get_conn_params(self) -> dict[str, str | None]:
152156

153157
def get_uri(self) -> str:
154158
"""Overridden to use the Athena dialect as driver name."""
159+
from airflow.exceptions import AirflowOptionalProviderFeatureException
160+
161+
if URL is None:
162+
raise AirflowOptionalProviderFeatureException(
163+
"sqlalchemy is required to generate the connection URI. "
164+
"Install it with: pip install 'apache-airflow-providers-amazon[sqlalchemy]'"
165+
)
155166
conn_params = self._get_conn_params()
156167
creds = self.get_credentials(region_name=conn_params["region_name"])
157-
158168
return URL.create(
159169
f"awsathena+{conn_params['driver']}",
160170
username=creds.access_key,

providers/amazon/src/airflow/providers/amazon/aws/hooks/redshift_sql.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,14 @@
2222
import redshift_connector
2323
import tenacity
2424
from redshift_connector import Connection as RedshiftConnection, InterfaceError, OperationalError
25-
from sqlalchemy import create_engine
26-
from sqlalchemy.engine.url import URL
2725

26+
try:
27+
from sqlalchemy import create_engine
28+
from sqlalchemy.engine.url import URL
29+
except ImportError:
30+
URL = create_engine = None
31+
32+
from airflow.exceptions import AirflowOptionalProviderFeatureException
2833
from airflow.providers.amazon.aws.hooks.base_aws import AwsBaseHook
2934
from airflow.providers.common.compat.sdk import AirflowException
3035
from airflow.providers.common.sql.hooks.sql import DbApiHook
@@ -151,6 +156,11 @@ def get_iam_token(self, conn: Connection) -> tuple[str, str, int]:
151156

152157
def get_uri(self) -> str:
153158
"""Overridden to use the Redshift dialect as driver name."""
159+
if URL is None:
160+
raise AirflowOptionalProviderFeatureException(
161+
"sqlalchemy is required to generate the connection URI. "
162+
"Install it with: pip install 'apache-airflow-providers-amazon[sqlalchemy]'"
163+
)
154164
conn_params = self._get_conn_params()
155165

156166
if "user" in conn_params:
@@ -174,6 +184,11 @@ def get_uri(self) -> str:
174184

175185
def get_sqlalchemy_engine(self, engine_kwargs=None):
176186
"""Overridden to pass Redshift-specific arguments."""
187+
if create_engine is None:
188+
raise AirflowOptionalProviderFeatureException(
189+
"sqlalchemy is required for creating the engine. Install it with"
190+
": pip install 'apache-airflow-providers-amazon[sqlalchemy]'"
191+
)
177192
conn_kwargs = self.conn.extra_dejson
178193
if engine_kwargs is None:
179194
engine_kwargs = {}

0 commit comments

Comments
 (0)