apache-airflow-providers-common-sql 2.0.2rc1__tar.gz → 2.0.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/PKG-INFO +8 -8
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/README.rst +3 -3
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/docs/changelog.rst +12 -1
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/docs/index.rst +3 -3
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/provider.yaml +2 -1
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/pyproject.toml +5 -5
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/__init__.py +1 -1
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/hooks/sql.py +36 -1
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/unit/common/sql/hooks/test_sql.py +92 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/.gitignore +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/LICENSE +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/NOTICE +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/docs/.latest-doc-only-change.txt +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/docs/commits.rst +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/docs/conf.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/docs/connections.rst +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/docs/dataframes.rst +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/docs/dialects.rst +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/docs/installing-providers-from-sources.rst +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/docs/integration-logos/sql.png +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/docs/operators.rst +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/docs/security.rst +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/docs/supported-database-types.rst +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/__init__.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/__init__.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/__init__.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/README_API.md +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/config.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/datafusion/__init__.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/datafusion/base.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/datafusion/engine.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/datafusion/exceptions.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/datafusion/format_handlers.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/datafusion/object_storage_provider.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/decorators/__init__.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/decorators/analytics.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/decorators/sql.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/dialects/__init__.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/dialects/dialect.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/dialects/dialect.pyi +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/doc/adr/0001-record-architecture-decisions.md +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/doc/adr/0002-return-common-data-structure-from-dbapihook-derived-hooks.md +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/doc/adr/0003-introduce-notion-of-dialects-in-dbapihook.md +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/example_dags/__init__.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/example_dags/example_analytics.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/get_provider_info.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/get_provider_info.pyi +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/hooks/__init__.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/hooks/handlers.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/hooks/handlers.pyi +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/hooks/lineage.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/hooks/lineage.pyi +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/hooks/sql.pyi +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/operators/__init__.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/operators/analytics.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/operators/generic_transfer.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/operators/generic_transfer.pyi +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/operators/sql.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/sensors/__init__.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/sensors/sql.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/sensors/sql.pyi +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/triggers/__init__.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/triggers/sql.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/triggers/sql.pyi +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/src/airflow/providers/common/sql/version_compat.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/conftest.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/system/__init__.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/system/common/__init__.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/system/common/sql/__init__.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/system/common/sql/example_generic_transfer.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/system/common/sql/example_sql_column_table_check.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/system/common/sql/example_sql_execute_query.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/system/common/sql/example_sql_insert_rows.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/system/common/sql/example_sql_threshold_check.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/system/common/sql/example_sql_value_check.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/unit/__init__.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/unit/common/__init__.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/unit/common/sql/__init__.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/unit/common/sql/datafusion/__init__.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/unit/common/sql/datafusion/test_engine.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/unit/common/sql/datafusion/test_format_handlers.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/unit/common/sql/datafusion/test_object_storage_provider.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/unit/common/sql/decorators/__init__.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/unit/common/sql/decorators/test_analytics.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/unit/common/sql/decorators/test_sql.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/unit/common/sql/dialects/__init__.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/unit/common/sql/dialects/test_dialect.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/unit/common/sql/hooks/__init__.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/unit/common/sql/hooks/test_dbapi.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/unit/common/sql/hooks/test_handlers.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/unit/common/sql/hooks/test_lineage.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/unit/common/sql/hooks/test_sqlparse.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/unit/common/sql/operators/__init__.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/unit/common/sql/operators/test_analytics.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/unit/common/sql/operators/test_generic_transfer.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/unit/common/sql/operators/test_sql.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/unit/common/sql/operators/test_sql_execute.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/unit/common/sql/sensors/__init__.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/unit/common/sql/sensors/test_sql.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/unit/common/sql/test_config.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/unit/common/sql/triggers/__init__.py +0 -0
- {apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/tests/unit/common/sql/triggers/test_sql.py +0 -0
{apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: apache-airflow-providers-common-sql
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.3
|
|
4
4
|
Summary: Provider package apache-airflow-providers-common-sql for Apache Airflow
|
|
5
5
|
Keywords: airflow-provider,common.sql,airflow,integration
|
|
6
6
|
Author-email: Apache Software Foundation <dev@airflow.apache.org>
|
|
@@ -23,8 +23,8 @@ Classifier: Programming Language :: Python :: 3.14
|
|
|
23
23
|
Classifier: Topic :: System :: Monitoring
|
|
24
24
|
License-File: LICENSE
|
|
25
25
|
License-File: NOTICE
|
|
26
|
-
Requires-Dist: apache-airflow>=2.11.
|
|
27
|
-
Requires-Dist: apache-airflow-providers-common-compat>=1.14.
|
|
26
|
+
Requires-Dist: apache-airflow>=2.11.0
|
|
27
|
+
Requires-Dist: apache-airflow-providers-common-compat>=1.14.1
|
|
28
28
|
Requires-Dist: sqlparse>=0.5.1
|
|
29
29
|
Requires-Dist: more-itertools>=9.0.0
|
|
30
30
|
Requires-Dist: methodtools>=0.4.7
|
|
@@ -39,8 +39,8 @@ Requires-Dist: polars>=1.26.0 ; extra == "polars"
|
|
|
39
39
|
Requires-Dist: pyiceberg-core>=0.8.0 ; extra == "pyiceberg-core"
|
|
40
40
|
Requires-Dist: sqlalchemy>=1.4.54 ; extra == "sqlalchemy"
|
|
41
41
|
Project-URL: Bug Tracker, https://github.com/apache/airflow/issues
|
|
42
|
-
Project-URL: Changelog, https://airflow.
|
|
43
|
-
Project-URL: Documentation, https://airflow.
|
|
42
|
+
Project-URL: Changelog, https://airflow.apache.org/docs/apache-airflow-providers-common-sql/2.0.3/changelog.html
|
|
43
|
+
Project-URL: Documentation, https://airflow.apache.org/docs/apache-airflow-providers-common-sql/2.0.3
|
|
44
44
|
Project-URL: Mastodon, https://fosstodon.org/@airflow
|
|
45
45
|
Project-URL: Slack Chat, https://s.apache.org/airflow-slack
|
|
46
46
|
Project-URL: Source Code, https://github.com/apache/airflow
|
|
@@ -79,7 +79,7 @@ Provides-Extra: sqlalchemy
|
|
|
79
79
|
|
|
80
80
|
Package ``apache-airflow-providers-common-sql``
|
|
81
81
|
|
|
82
|
-
Release: ``2.0.
|
|
82
|
+
Release: ``2.0.3``
|
|
83
83
|
|
|
84
84
|
|
|
85
85
|
`Common SQL Provider <https://en.wikipedia.org/wiki/SQL>`__
|
|
@@ -92,7 +92,7 @@ This is a provider package for ``common.sql`` provider. All classes for this pro
|
|
|
92
92
|
are in ``airflow.providers.common.sql`` python package.
|
|
93
93
|
|
|
94
94
|
You can find package information and changelog for the provider
|
|
95
|
-
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-common-sql/2.0.
|
|
95
|
+
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-common-sql/2.0.3/>`_.
|
|
96
96
|
|
|
97
97
|
Installation
|
|
98
98
|
------------
|
|
@@ -154,5 +154,5 @@ Extra Dependencies
|
|
|
154
154
|
================== =======================================================================================================================================================================
|
|
155
155
|
|
|
156
156
|
The changelog for the provider package can be found in the
|
|
157
|
-
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-common-sql/2.0.
|
|
157
|
+
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-common-sql/2.0.3/changelog.html>`_.
|
|
158
158
|
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
|
|
24
24
|
Package ``apache-airflow-providers-common-sql``
|
|
25
25
|
|
|
26
|
-
Release: ``2.0.
|
|
26
|
+
Release: ``2.0.3``
|
|
27
27
|
|
|
28
28
|
|
|
29
29
|
`Common SQL Provider <https://en.wikipedia.org/wiki/SQL>`__
|
|
@@ -36,7 +36,7 @@ This is a provider package for ``common.sql`` provider. All classes for this pro
|
|
|
36
36
|
are in ``airflow.providers.common.sql`` python package.
|
|
37
37
|
|
|
38
38
|
You can find package information and changelog for the provider
|
|
39
|
-
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-common-sql/2.0.
|
|
39
|
+
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-common-sql/2.0.3/>`_.
|
|
40
40
|
|
|
41
41
|
Installation
|
|
42
42
|
------------
|
|
@@ -98,4 +98,4 @@ Extra Dependencies
|
|
|
98
98
|
================== =======================================================================================================================================================================
|
|
99
99
|
|
|
100
100
|
The changelog for the provider package can be found in the
|
|
101
|
-
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-common-sql/2.0.
|
|
101
|
+
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-common-sql/2.0.3/changelog.html>`_.
|
|
@@ -25,6 +25,18 @@
|
|
|
25
25
|
Changelog
|
|
26
26
|
---------
|
|
27
27
|
|
|
28
|
+
2.0.3
|
|
29
|
+
.....
|
|
30
|
+
|
|
31
|
+
Misc
|
|
32
|
+
~~~~
|
|
33
|
+
|
|
34
|
+
* ``Make psycopg (v3) the default synchronous Postgres driver (#69526)``
|
|
35
|
+
|
|
36
|
+
.. Below changes are excluded from the changelog. Move them to
|
|
37
|
+
appropriate section above if needed. Do not delete the lines(!):
|
|
38
|
+
|
|
39
|
+
|
|
28
40
|
2.0.2
|
|
29
41
|
.....
|
|
30
42
|
|
|
@@ -780,7 +792,6 @@ Misc
|
|
|
780
792
|
`Apache Airflow providers support policy <https://github.com/apache/airflow/blob/main/PROVIDERS.rst#minimum-supported-version-of-airflow-for-community-managed-providers>`_.
|
|
781
793
|
|
|
782
794
|
|
|
783
|
-
|
|
784
795
|
Features
|
|
785
796
|
~~~~~~~~
|
|
786
797
|
|
|
@@ -79,7 +79,7 @@ apache-airflow-providers-common-sql package
|
|
|
79
79
|
`Common SQL Provider <https://en.wikipedia.org/wiki/SQL>`__
|
|
80
80
|
|
|
81
81
|
|
|
82
|
-
Release: 2.0.
|
|
82
|
+
Release: 2.0.3
|
|
83
83
|
|
|
84
84
|
Provider package
|
|
85
85
|
----------------
|
|
@@ -160,5 +160,5 @@ Downloading official packages
|
|
|
160
160
|
You can download officially released packages and verify their checksums and signatures from the
|
|
161
161
|
`Official Apache Download site <https://downloads.apache.org/airflow/providers/>`_
|
|
162
162
|
|
|
163
|
-
* `The apache-airflow-providers-common-sql 2.0.
|
|
164
|
-
* `The apache-airflow-providers-common-sql 2.0.
|
|
163
|
+
* `The apache-airflow-providers-common-sql 2.0.3 sdist package <https://downloads.apache.org/airflow/providers/apache_airflow_providers_common_sql-2.0.3.tar.gz>`_ (`asc <https://downloads.apache.org/airflow/providers/apache_airflow_providers_common_sql-2.0.3.tar.gz.asc>`__, `sha512 <https://downloads.apache.org/airflow/providers/apache_airflow_providers_common_sql-2.0.3.tar.gz.sha512>`__)
|
|
164
|
+
* `The apache-airflow-providers-common-sql 2.0.3 wheel package <https://downloads.apache.org/airflow/providers/apache_airflow_providers_common_sql-2.0.3-py3-none-any.whl>`_ (`asc <https://downloads.apache.org/airflow/providers/apache_airflow_providers_common_sql-2.0.3-py3-none-any.whl.asc>`__, `sha512 <https://downloads.apache.org/airflow/providers/apache_airflow_providers_common_sql-2.0.3-py3-none-any.whl.sha512>`__)
|
|
@@ -23,12 +23,13 @@ description: |
|
|
|
23
23
|
|
|
24
24
|
state: ready
|
|
25
25
|
lifecycle: production
|
|
26
|
-
source-date-epoch:
|
|
26
|
+
source-date-epoch: 1784746595
|
|
27
27
|
# Note that those versions are maintained by release manager - do not update them manually
|
|
28
28
|
# with the exception of case where other provider in sources has >= new provider version.
|
|
29
29
|
# In such case adding >= NEW_VERSION and bumping to NEW_VERSION in a provider have
|
|
30
30
|
# to be done in the same PR
|
|
31
31
|
versions:
|
|
32
|
+
- 2.0.3
|
|
32
33
|
- 2.0.2
|
|
33
34
|
- 2.0.1
|
|
34
35
|
- 2.0.0
|
|
@@ -25,7 +25,7 @@ build-backend = "flit_core.buildapi"
|
|
|
25
25
|
|
|
26
26
|
[project]
|
|
27
27
|
name = "apache-airflow-providers-common-sql"
|
|
28
|
-
version = "2.0.
|
|
28
|
+
version = "2.0.3"
|
|
29
29
|
description = "Provider package apache-airflow-providers-common-sql for Apache Airflow"
|
|
30
30
|
readme = "README.rst"
|
|
31
31
|
license = "Apache-2.0"
|
|
@@ -59,8 +59,8 @@ requires-python = ">=3.10"
|
|
|
59
59
|
# Make sure to run ``prek update-providers-dependencies --all-files``
|
|
60
60
|
# After you modify the dependencies, and rebuild your Breeze CI image with ``breeze ci-image build``
|
|
61
61
|
dependencies = [
|
|
62
|
-
"apache-airflow>=2.11.
|
|
63
|
-
"apache-airflow-providers-common-compat>=1.14.
|
|
62
|
+
"apache-airflow>=2.11.0",
|
|
63
|
+
"apache-airflow-providers-common-compat>=1.14.1",
|
|
64
64
|
"sqlparse>=0.5.1",
|
|
65
65
|
"more-itertools>=9.0.0",
|
|
66
66
|
# The methodtools dependency is necessary since the introduction of dialects:
|
|
@@ -148,8 +148,8 @@ apache-airflow-providers-common-sql = {workspace = true}
|
|
|
148
148
|
apache-airflow-providers-standard = {workspace = true}
|
|
149
149
|
|
|
150
150
|
[project.urls]
|
|
151
|
-
"Documentation" = "https://airflow.
|
|
152
|
-
"Changelog" = "https://airflow.
|
|
151
|
+
"Documentation" = "https://airflow.apache.org/docs/apache-airflow-providers-common-sql/2.0.3"
|
|
152
|
+
"Changelog" = "https://airflow.apache.org/docs/apache-airflow-providers-common-sql/2.0.3/changelog.html"
|
|
153
153
|
"Bug Tracker" = "https://github.com/apache/airflow/issues"
|
|
154
154
|
"Source Code" = "https://github.com/apache/airflow"
|
|
155
155
|
"Slack Chat" = "https://s.apache.org/airflow-slack"
|
|
@@ -29,7 +29,7 @@ from airflow import __version__ as airflow_version
|
|
|
29
29
|
|
|
30
30
|
__all__ = ["__version__"]
|
|
31
31
|
|
|
32
|
-
__version__ = "2.0.
|
|
32
|
+
__version__ = "2.0.3"
|
|
33
33
|
|
|
34
34
|
if packaging.version.parse(packaging.version.parse(airflow_version).base_version) < packaging.version.parse(
|
|
35
35
|
"2.11.0"
|
|
@@ -22,6 +22,7 @@ from collections.abc import Callable, Generator, Iterable, Mapping, MutableMappi
|
|
|
22
22
|
from contextlib import closing, contextmanager, suppress
|
|
23
23
|
from datetime import datetime
|
|
24
24
|
from functools import cached_property
|
|
25
|
+
from importlib.util import find_spec
|
|
25
26
|
from typing import TYPE_CHECKING, Any, Literal, Protocol, TypeVar, cast, overload
|
|
26
27
|
from urllib.parse import urlparse
|
|
27
28
|
|
|
@@ -66,6 +67,16 @@ if TYPE_CHECKING:
|
|
|
66
67
|
|
|
67
68
|
T = TypeVar("T")
|
|
68
69
|
SQL_PLACEHOLDERS = frozenset({"%s", "?"})
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def _is_sqlalchemy_2() -> bool:
|
|
73
|
+
"""Whether the installed SQLAlchemy has the native psycopg (v3) dialect (added in 2.0)."""
|
|
74
|
+
from packaging.version import Version
|
|
75
|
+
from sqlalchemy import __version__ as sqlalchemy_version
|
|
76
|
+
|
|
77
|
+
return Version(sqlalchemy_version) >= Version("2.0.0")
|
|
78
|
+
|
|
79
|
+
|
|
69
80
|
WARNING_MESSAGE = """Import of {} from the 'airflow.providers.common.sql.hooks' module is deprecated and will
|
|
70
81
|
be removed in the future. Please import it from 'airflow.providers.common.sql.hooks.handlers'."""
|
|
71
82
|
|
|
@@ -334,7 +345,31 @@ class DbApiHook(BaseHook):
|
|
|
334
345
|
|
|
335
346
|
self.log.debug("url: %s", url)
|
|
336
347
|
self.log.debug("engine_kwargs: %s", engine_kwargs)
|
|
337
|
-
|
|
348
|
+
try:
|
|
349
|
+
return create_engine(url=url, **engine_kwargs)
|
|
350
|
+
except (ImportError, ModuleNotFoundError):
|
|
351
|
+
# SQLAlchemy resolves a bare "postgresql" scheme to the psycopg2 DB-API by default.
|
|
352
|
+
# Retry with a driver this hook can actually resolve, since psycopg2 may not be
|
|
353
|
+
# installed now that it's an optional extra of apache-airflow-providers-postgres.
|
|
354
|
+
parsed_url = make_url(url) if make_url is not None else None
|
|
355
|
+
if parsed_url is None or parsed_url.drivername != "postgresql":
|
|
356
|
+
raise
|
|
357
|
+
# psycopg (v3) may be importable where SQLAlchemy is pinned below 2.0, which has no
|
|
358
|
+
# native "postgresql+psycopg" dialect and would raise NoSuchModuleError — so only
|
|
359
|
+
# prefer it on SQLAlchemy 2.0+; otherwise fall back to psycopg2.
|
|
360
|
+
if find_spec("psycopg") is not None and _is_sqlalchemy_2():
|
|
361
|
+
self.log.info(
|
|
362
|
+
"SQLAlchemy could not load a DB-API driver for the bare 'postgresql://' URL; "
|
|
363
|
+
"retrying with psycopg (v3) ('postgresql+psycopg')."
|
|
364
|
+
)
|
|
365
|
+
return create_engine(url=parsed_url.set(drivername="postgresql+psycopg"), **engine_kwargs)
|
|
366
|
+
if find_spec("psycopg2") is not None:
|
|
367
|
+
self.log.info(
|
|
368
|
+
"SQLAlchemy could not load a DB-API driver for the bare 'postgresql://' URL; "
|
|
369
|
+
"retrying with 'postgresql+psycopg2'."
|
|
370
|
+
)
|
|
371
|
+
return create_engine(url=parsed_url.set(drivername="postgresql+psycopg2"), **engine_kwargs)
|
|
372
|
+
raise
|
|
338
373
|
|
|
339
374
|
@cached_property
|
|
340
375
|
def inspector(self) -> Inspector:
|
|
@@ -334,6 +334,98 @@ class TestDbApiHook:
|
|
|
334
334
|
assert isinstance(df, expected_type)
|
|
335
335
|
|
|
336
336
|
|
|
337
|
+
class TestDbApiHookGetSqlalchemyEngine:
|
|
338
|
+
"""SQLAlchemy resolves a bare ``postgresql`` scheme to the psycopg2 DB-API by default, which
|
|
339
|
+
may not be installed now that it's an optional extra of apache-airflow-providers-postgres."""
|
|
340
|
+
|
|
341
|
+
@pytest.mark.db_test
|
|
342
|
+
@patch("airflow.providers.common.sql.hooks.sql._is_sqlalchemy_2", return_value=True)
|
|
343
|
+
@patch("airflow.providers.common.sql.hooks.sql.find_spec")
|
|
344
|
+
@patch("airflow.providers.common.sql.hooks.sql.create_engine")
|
|
345
|
+
def test_falls_back_to_psycopg_when_psycopg2_import_fails(
|
|
346
|
+
self, mock_create_engine, mock_find_spec, mock_is_sqlalchemy_2, caplog
|
|
347
|
+
):
|
|
348
|
+
mock_find_spec.return_value = object()
|
|
349
|
+
mock_create_engine.side_effect = [ModuleNotFoundError("No module named 'psycopg2'"), MagicMock()]
|
|
350
|
+
dbapi_hook = mock_db_hook(DbApiHook, conn_params={"conn_type": "postgresql"})
|
|
351
|
+
|
|
352
|
+
dbapi_hook.get_sqlalchemy_engine()
|
|
353
|
+
|
|
354
|
+
assert mock_create_engine.call_count == 2
|
|
355
|
+
retried_url = mock_create_engine.call_args.kwargs["url"]
|
|
356
|
+
assert retried_url.drivername == "postgresql+psycopg"
|
|
357
|
+
assert (
|
|
358
|
+
"SQLAlchemy could not load a DB-API driver for the bare 'postgresql://' URL; "
|
|
359
|
+
"retrying with psycopg (v3) ('postgresql+psycopg')."
|
|
360
|
+
) in caplog.text
|
|
361
|
+
|
|
362
|
+
@pytest.mark.db_test
|
|
363
|
+
@patch("airflow.providers.common.sql.hooks.sql._is_sqlalchemy_2", return_value=False)
|
|
364
|
+
@patch("airflow.providers.common.sql.hooks.sql.find_spec")
|
|
365
|
+
@patch("airflow.providers.common.sql.hooks.sql.create_engine")
|
|
366
|
+
def test_falls_back_to_psycopg2_when_sqlalchemy_below_2(
|
|
367
|
+
self, mock_create_engine, mock_find_spec, mock_is_sqlalchemy_2, caplog
|
|
368
|
+
):
|
|
369
|
+
# SQLAlchemy 1.4 (shipped with Airflow 2.11) has no native "postgresql+psycopg" dialect,
|
|
370
|
+
# so even when psycopg (v3) is importable the retry must use psycopg2, not psycopg.
|
|
371
|
+
mock_find_spec.return_value = object()
|
|
372
|
+
mock_create_engine.side_effect = [ModuleNotFoundError("No module named 'psycopg2'"), MagicMock()]
|
|
373
|
+
dbapi_hook = mock_db_hook(DbApiHook, conn_params={"conn_type": "postgresql"})
|
|
374
|
+
|
|
375
|
+
dbapi_hook.get_sqlalchemy_engine()
|
|
376
|
+
|
|
377
|
+
assert mock_create_engine.call_count == 2
|
|
378
|
+
retried_url = mock_create_engine.call_args.kwargs["url"]
|
|
379
|
+
assert retried_url.drivername == "postgresql+psycopg2"
|
|
380
|
+
assert (
|
|
381
|
+
"SQLAlchemy could not load a DB-API driver for the bare 'postgresql://' URL; "
|
|
382
|
+
"retrying with 'postgresql+psycopg2'."
|
|
383
|
+
) in caplog.text
|
|
384
|
+
|
|
385
|
+
@pytest.mark.db_test
|
|
386
|
+
@patch("airflow.providers.common.sql.hooks.sql.find_spec")
|
|
387
|
+
@patch("airflow.providers.common.sql.hooks.sql.create_engine")
|
|
388
|
+
def test_falls_back_to_psycopg2_when_psycopg_unavailable(
|
|
389
|
+
self, mock_create_engine, mock_find_spec, caplog
|
|
390
|
+
):
|
|
391
|
+
mock_find_spec.side_effect = lambda name: None if name == "psycopg" else object()
|
|
392
|
+
mock_create_engine.side_effect = [ModuleNotFoundError("No module named 'psycopg2'"), MagicMock()]
|
|
393
|
+
dbapi_hook = mock_db_hook(DbApiHook, conn_params={"conn_type": "postgresql"})
|
|
394
|
+
|
|
395
|
+
dbapi_hook.get_sqlalchemy_engine()
|
|
396
|
+
|
|
397
|
+
assert mock_create_engine.call_count == 2
|
|
398
|
+
retried_url = mock_create_engine.call_args.kwargs["url"]
|
|
399
|
+
assert retried_url.drivername == "postgresql+psycopg2"
|
|
400
|
+
assert (
|
|
401
|
+
"SQLAlchemy could not load a DB-API driver for the bare 'postgresql://' URL; "
|
|
402
|
+
"retrying with 'postgresql+psycopg2'."
|
|
403
|
+
) in caplog.text
|
|
404
|
+
|
|
405
|
+
@pytest.mark.db_test
|
|
406
|
+
@patch("airflow.providers.common.sql.hooks.sql.find_spec", return_value=None)
|
|
407
|
+
@patch("airflow.providers.common.sql.hooks.sql.create_engine")
|
|
408
|
+
def test_reraises_when_no_postgres_driver_is_available(self, mock_create_engine, mock_find_spec):
|
|
409
|
+
original_error = ModuleNotFoundError("No module named 'psycopg2'")
|
|
410
|
+
mock_create_engine.side_effect = original_error
|
|
411
|
+
dbapi_hook = mock_db_hook(DbApiHook, conn_params={"conn_type": "postgresql"})
|
|
412
|
+
|
|
413
|
+
with pytest.raises(ModuleNotFoundError, match="psycopg2"):
|
|
414
|
+
dbapi_hook.get_sqlalchemy_engine()
|
|
415
|
+
mock_create_engine.assert_called_once()
|
|
416
|
+
|
|
417
|
+
@pytest.mark.db_test
|
|
418
|
+
@patch("airflow.providers.common.sql.hooks.sql.create_engine")
|
|
419
|
+
def test_does_not_retry_for_non_postgres_schemes(self, mock_create_engine):
|
|
420
|
+
original_error = ModuleNotFoundError("No module named 'some_other_driver'")
|
|
421
|
+
mock_create_engine.side_effect = original_error
|
|
422
|
+
dbapi_hook = mock_db_hook(DbApiHook, conn_params={"conn_type": "mysql"})
|
|
423
|
+
|
|
424
|
+
with pytest.raises(ModuleNotFoundError, match="some_other_driver"):
|
|
425
|
+
dbapi_hook.get_sqlalchemy_engine()
|
|
426
|
+
mock_create_engine.assert_called_once()
|
|
427
|
+
|
|
428
|
+
|
|
337
429
|
class TestDbApiHookGetTableSchema:
|
|
338
430
|
@pytest.mark.db_test
|
|
339
431
|
def test_get_table_schema(self):
|
|
File without changes
|
{apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/LICENSE
RENAMED
|
File without changes
|
{apache_airflow_providers_common_sql-2.0.2rc1 → apache_airflow_providers_common_sql-2.0.3}/NOTICE
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|