apache-airflow-providers-common-sql 2.0.2__tar.gz → 2.0.3rc1__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.
Files changed (102) hide show
  1. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/PKG-INFO +8 -8
  2. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/README.rst +3 -3
  3. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/docs/changelog.rst +12 -1
  4. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/docs/index.rst +3 -3
  5. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/provider.yaml +2 -1
  6. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/pyproject.toml +5 -5
  7. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/__init__.py +1 -1
  8. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/hooks/sql.py +36 -1
  9. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/unit/common/sql/hooks/test_sql.py +92 -0
  10. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/.gitignore +0 -0
  11. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/LICENSE +0 -0
  12. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/NOTICE +0 -0
  13. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/docs/.latest-doc-only-change.txt +0 -0
  14. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/docs/commits.rst +0 -0
  15. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/docs/conf.py +0 -0
  16. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/docs/connections.rst +0 -0
  17. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/docs/dataframes.rst +0 -0
  18. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/docs/dialects.rst +0 -0
  19. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/docs/installing-providers-from-sources.rst +0 -0
  20. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/docs/integration-logos/sql.png +0 -0
  21. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/docs/operators.rst +0 -0
  22. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/docs/security.rst +0 -0
  23. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/docs/supported-database-types.rst +0 -0
  24. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/__init__.py +0 -0
  25. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/__init__.py +0 -0
  26. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/__init__.py +0 -0
  27. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/README_API.md +0 -0
  28. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/config.py +0 -0
  29. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/datafusion/__init__.py +0 -0
  30. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/datafusion/base.py +0 -0
  31. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/datafusion/engine.py +0 -0
  32. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/datafusion/exceptions.py +0 -0
  33. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/datafusion/format_handlers.py +0 -0
  34. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/datafusion/object_storage_provider.py +0 -0
  35. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/decorators/__init__.py +0 -0
  36. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/decorators/analytics.py +0 -0
  37. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/decorators/sql.py +0 -0
  38. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/dialects/__init__.py +0 -0
  39. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/dialects/dialect.py +0 -0
  40. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/dialects/dialect.pyi +0 -0
  41. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/doc/adr/0001-record-architecture-decisions.md +0 -0
  42. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/doc/adr/0002-return-common-data-structure-from-dbapihook-derived-hooks.md +0 -0
  43. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/doc/adr/0003-introduce-notion-of-dialects-in-dbapihook.md +0 -0
  44. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/example_dags/__init__.py +0 -0
  45. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/example_dags/example_analytics.py +0 -0
  46. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/get_provider_info.py +0 -0
  47. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/get_provider_info.pyi +0 -0
  48. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/hooks/__init__.py +0 -0
  49. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/hooks/handlers.py +0 -0
  50. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/hooks/handlers.pyi +0 -0
  51. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/hooks/lineage.py +0 -0
  52. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/hooks/lineage.pyi +0 -0
  53. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/hooks/sql.pyi +0 -0
  54. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/operators/__init__.py +0 -0
  55. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/operators/analytics.py +0 -0
  56. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/operators/generic_transfer.py +0 -0
  57. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/operators/generic_transfer.pyi +0 -0
  58. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/operators/sql.py +0 -0
  59. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/sensors/__init__.py +0 -0
  60. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/sensors/sql.py +0 -0
  61. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/sensors/sql.pyi +0 -0
  62. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/triggers/__init__.py +0 -0
  63. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/triggers/sql.py +0 -0
  64. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/triggers/sql.pyi +0 -0
  65. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/src/airflow/providers/common/sql/version_compat.py +0 -0
  66. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/conftest.py +0 -0
  67. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/system/__init__.py +0 -0
  68. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/system/common/__init__.py +0 -0
  69. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/system/common/sql/__init__.py +0 -0
  70. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/system/common/sql/example_generic_transfer.py +0 -0
  71. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/system/common/sql/example_sql_column_table_check.py +0 -0
  72. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/system/common/sql/example_sql_execute_query.py +0 -0
  73. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/system/common/sql/example_sql_insert_rows.py +0 -0
  74. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/system/common/sql/example_sql_threshold_check.py +0 -0
  75. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/system/common/sql/example_sql_value_check.py +0 -0
  76. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/unit/__init__.py +0 -0
  77. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/unit/common/__init__.py +0 -0
  78. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/unit/common/sql/__init__.py +0 -0
  79. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/unit/common/sql/datafusion/__init__.py +0 -0
  80. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/unit/common/sql/datafusion/test_engine.py +0 -0
  81. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/unit/common/sql/datafusion/test_format_handlers.py +0 -0
  82. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/unit/common/sql/datafusion/test_object_storage_provider.py +0 -0
  83. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/unit/common/sql/decorators/__init__.py +0 -0
  84. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/unit/common/sql/decorators/test_analytics.py +0 -0
  85. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/unit/common/sql/decorators/test_sql.py +0 -0
  86. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/unit/common/sql/dialects/__init__.py +0 -0
  87. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/unit/common/sql/dialects/test_dialect.py +0 -0
  88. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/unit/common/sql/hooks/__init__.py +0 -0
  89. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/unit/common/sql/hooks/test_dbapi.py +0 -0
  90. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/unit/common/sql/hooks/test_handlers.py +0 -0
  91. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/unit/common/sql/hooks/test_lineage.py +0 -0
  92. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/unit/common/sql/hooks/test_sqlparse.py +0 -0
  93. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/unit/common/sql/operators/__init__.py +0 -0
  94. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/unit/common/sql/operators/test_analytics.py +0 -0
  95. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/unit/common/sql/operators/test_generic_transfer.py +0 -0
  96. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/unit/common/sql/operators/test_sql.py +0 -0
  97. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/unit/common/sql/operators/test_sql_execute.py +0 -0
  98. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/unit/common/sql/sensors/__init__.py +0 -0
  99. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/unit/common/sql/sensors/test_sql.py +0 -0
  100. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/unit/common/sql/test_config.py +0 -0
  101. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/unit/common/sql/triggers/__init__.py +0 -0
  102. {apache_airflow_providers_common_sql-2.0.2 → apache_airflow_providers_common_sql-2.0.3rc1}/tests/unit/common/sql/triggers/test_sql.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: apache-airflow-providers-common-sql
3
- Version: 2.0.2
3
+ Version: 2.0.3rc1
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.0
27
- Requires-Dist: apache-airflow-providers-common-compat>=1.14.1
26
+ Requires-Dist: apache-airflow>=2.11.0rc1
27
+ Requires-Dist: apache-airflow-providers-common-compat>=1.14.1rc1
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.apache.org/docs/apache-airflow-providers-common-sql/2.0.2/changelog.html
43
- Project-URL: Documentation, https://airflow.apache.org/docs/apache-airflow-providers-common-sql/2.0.2
42
+ Project-URL: Changelog, https://airflow.staged.apache.org/docs/apache-airflow-providers-common-sql/2.0.3/changelog.html
43
+ Project-URL: Documentation, https://airflow.staged.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.2``
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.2/>`_.
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.2/changelog.html>`_.
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.2``
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.2/>`_.
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.2/changelog.html>`_.
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.2
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.2 sdist package <https://downloads.apache.org/airflow/providers/apache_airflow_providers_common_sql-2.0.2.tar.gz>`_ (`asc <https://downloads.apache.org/airflow/providers/apache_airflow_providers_common_sql-2.0.2.tar.gz.asc>`__, `sha512 <https://downloads.apache.org/airflow/providers/apache_airflow_providers_common_sql-2.0.2.tar.gz.sha512>`__)
164
- * `The apache-airflow-providers-common-sql 2.0.2 wheel package <https://downloads.apache.org/airflow/providers/apache_airflow_providers_common_sql-2.0.2-py3-none-any.whl>`_ (`asc <https://downloads.apache.org/airflow/providers/apache_airflow_providers_common_sql-2.0.2-py3-none-any.whl.asc>`__, `sha512 <https://downloads.apache.org/airflow/providers/apache_airflow_providers_common_sql-2.0.2-py3-none-any.whl.sha512>`__)
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: 1783356304
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.2"
28
+ version = "2.0.3rc1"
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.0",
63
- "apache-airflow-providers-common-compat>=1.14.1",
62
+ "apache-airflow>=2.11.0rc1",
63
+ "apache-airflow-providers-common-compat>=1.14.1rc1",
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.apache.org/docs/apache-airflow-providers-common-sql/2.0.2"
152
- "Changelog" = "https://airflow.apache.org/docs/apache-airflow-providers-common-sql/2.0.2/changelog.html"
151
+ "Documentation" = "https://airflow.staged.apache.org/docs/apache-airflow-providers-common-sql/2.0.3"
152
+ "Changelog" = "https://airflow.staged.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.2"
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
- return create_engine(url=url, **engine_kwargs)
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):