From 8d9d437e6143b76d982cbad13d4f299ef79ee9b3 Mon Sep 17 00:00:00 2001 From: Benjamin Date: Thu, 9 Jan 2025 22:24:57 +0000 Subject: [PATCH 01/11] Basic update to version 1.9 of DBT, requires removing a test related to merge incremental type as the fabric has removed support for this in favour of microbatch. --- .pre-commit-config.yaml | 2 +- dbt/include/sqlserver/dbt_project.yml | 2 +- setup.py | 4 ++-- tests/functional/adapter/dbt/test_incremental.py | 7 ------- 4 files changed, 4 insertions(+), 11 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3eaee28d..96d12849 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -32,7 +32,7 @@ repos: hooks: - id: absolufy-imports - repo: 'https://github.com/hadialqattan/pycln' - rev: v2.4.0 + rev: v2.5.0 hooks: - id: pycln args: diff --git a/dbt/include/sqlserver/dbt_project.yml b/dbt/include/sqlserver/dbt_project.yml index 511daca7..7b88fd58 100644 --- a/dbt/include/sqlserver/dbt_project.yml +++ b/dbt/include/sqlserver/dbt_project.yml @@ -1,5 +1,5 @@ name: dbt_sqlserver -version: 1.8.0 +version: 1.9.0 config-version: 2 macro-paths: ["macros"] diff --git a/setup.py b/setup.py index 4e491bee..fb8c5e7b 100644 --- a/setup.py +++ b/setup.py @@ -66,8 +66,8 @@ def run(self): packages=find_namespace_packages(include=["dbt", "dbt.*"]), include_package_data=True, install_requires=[ - "dbt-fabric>=1.8.0,<1.9.0", - "dbt-core>=1.8.0,<1.9.0", + "dbt-fabric>=1.9.0,<1.10.0", + "dbt-core>=1.9.0,<1.10.0", "dbt-common>=1.0,<2.0", "dbt-adapters>=1.1.1,<2.0", ], diff --git a/tests/functional/adapter/dbt/test_incremental.py b/tests/functional/adapter/dbt/test_incremental.py index 959a81d0..b3a5c9cb 100644 --- a/tests/functional/adapter/dbt/test_incremental.py +++ b/tests/functional/adapter/dbt/test_incremental.py @@ -1,8 +1,5 @@ import pytest from dbt.tests.adapter.incremental import fixtures -from dbt.tests.adapter.incremental.test_incremental_merge_exclude_columns import ( - BaseMergeExcludeColumns, -) from dbt.tests.adapter.incremental.test_incremental_on_schema_change import ( BaseIncrementalOnSchemaChange, ) @@ -76,10 +73,6 @@ """ -class TestIncrementalMergeExcludeColumns(BaseMergeExcludeColumns): - pass - - class TestIncrementalOnSchemaChange(BaseIncrementalOnSchemaChange): @pytest.fixture(scope="class") def models(self): From 32c2e3d0695069b2e8f460bc600a23bc2abc5dce Mon Sep 17 00:00:00 2001 From: Benjamin Date: Mon, 3 Feb 2025 18:15:47 +0000 Subject: [PATCH 02/11] Update the SQL server adapter to version 1.9. All changes are implemented by the upstream fabric adapter. We need to bring in an updated version of dbt-tests-adapter so we are on the same version as the upstream fabric adapater. This requires a change of imports for the empty tests as they changed in the adapater tests. --- dbt/adapters/sqlserver/__version__.py | 2 +- dev_requirements.txt | 2 +- setup.py | 4 ++-- tests/functional/adapter/dbt/test_empty.py | 3 +-- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/dbt/adapters/sqlserver/__version__.py b/dbt/adapters/sqlserver/__version__.py index 9675f250..7aba6409 100644 --- a/dbt/adapters/sqlserver/__version__.py +++ b/dbt/adapters/sqlserver/__version__.py @@ -1 +1 @@ -version = "1.8.7" +version = "1.9.0" diff --git a/dev_requirements.txt b/dev_requirements.txt index 4db3f028..acde42fe 100644 --- a/dev_requirements.txt +++ b/dev_requirements.txt @@ -1,5 +1,5 @@ -dbt-tests-adapter>=1.8.0, <1.9.0 +dbt-tests-adapter>=1.9.0 ruff black==24.8.0 diff --git a/setup.py b/setup.py index fb8c5e7b..05b5bb2a 100644 --- a/setup.py +++ b/setup.py @@ -8,7 +8,7 @@ package_name = "dbt-sqlserver" authors_list = ["Mikael Ene", "Anders Swanson", "Sam Debruyn", "Cor Zuurmond", "Cody Scott"] -dbt_version = "1.8" +dbt_version = "1.9" description = """A Microsoft SQL Server adapter plugin for dbt""" this_directory = os.path.abspath(os.path.dirname(__file__)) @@ -69,7 +69,7 @@ def run(self): "dbt-fabric>=1.9.0,<1.10.0", "dbt-core>=1.9.0,<1.10.0", "dbt-common>=1.0,<2.0", - "dbt-adapters>=1.1.1,<2.0", + "dbt-adapters>=1.11.0,<2.0", ], cmdclass={ "verify": VerifyVersionCommand, diff --git a/tests/functional/adapter/dbt/test_empty.py b/tests/functional/adapter/dbt/test_empty.py index 52ea88de..391b5b3b 100644 --- a/tests/functional/adapter/dbt/test_empty.py +++ b/tests/functional/adapter/dbt/test_empty.py @@ -1,12 +1,11 @@ import pytest +from dbt.tests.adapter.empty._models import model_input_sql, schema_sources_yml # switch for 1.9 # from dbt.tests.adapter.empty import _models from dbt.tests.adapter.empty.test_empty import ( # MetadataWithEmptyFlag BaseTestEmpty, BaseTestEmptyInlineSourceRef, - model_input_sql, - schema_sources_yml, ) from dbt.tests.util import run_dbt From 145e74e008a983d88292c815dc83e7026acc89db Mon Sep 17 00:00:00 2001 From: Benjamin Date: Thu, 20 Feb 2025 11:27:22 +0000 Subject: [PATCH 03/11] Add an update to allow microbatching to handle the datetime data type. This is not supported in Fabric so isn't covered by the upstream adapater. DBT passes in event times using a UTC string that datetime column types cannot parse. By converting this to a datetimeoffset it can be filtered against datetime, datetime2 and datetimeoffset columns which can exist in SQL Server. --- dbt/adapters/sqlserver/sqlserver_relation.py | 27 ++++++++++- .../models/incremental/merge.sql | 31 ++++++++++++ .../test_incremental_microbatch_datetime.py | 47 +++++++++++++++++++ 3 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 dbt/include/sqlserver/macros/materializations/models/incremental/merge.sql create mode 100644 tests/functional/adapter/dbt/test_incremental_microbatch_datetime.py diff --git a/dbt/adapters/sqlserver/sqlserver_relation.py b/dbt/adapters/sqlserver/sqlserver_relation.py index 279634f3..94be5d26 100644 --- a/dbt/adapters/sqlserver/sqlserver_relation.py +++ b/dbt/adapters/sqlserver/sqlserver_relation.py @@ -1,7 +1,7 @@ from dataclasses import dataclass, field from typing import Optional, Type -from dbt.adapters.base.relation import BaseRelation +from dbt.adapters.base.relation import BaseRelation, EventTimeFilter from dbt.adapters.utils import classproperty from dbt_common.exceptions import DbtRuntimeError @@ -49,3 +49,28 @@ def __post_init__(self): def relation_max_name_length(self): return MAX_CHARACTERS_IN_IDENTIFIER + + def _render_event_time_filtered(self, event_time_filter: EventTimeFilter) -> str: + """ + Returns "" if start and end are both None + """ + filter = "" + if event_time_filter.start and event_time_filter.end: + filter = ( + f"{event_time_filter.field_name} >=" + f" parse('{event_time_filter.start}' as datetimeoffset)" + f" and {event_time_filter.field_name} <" + f" parse('{event_time_filter.end}' as datetimeoffset)" + ) + elif event_time_filter.start: + filter = ( + f"{event_time_filter.field_name} >=" + f" parse('{event_time_filter.start}' as datetimeoffset)" + ) + elif event_time_filter.end: + filter = ( + f"{event_time_filter.field_name} <" + f" parse('{event_time_filter.end}' as datetimeoffset)" + ) + + return filter diff --git a/dbt/include/sqlserver/macros/materializations/models/incremental/merge.sql b/dbt/include/sqlserver/macros/materializations/models/incremental/merge.sql new file mode 100644 index 00000000..823b5b7e --- /dev/null +++ b/dbt/include/sqlserver/macros/materializations/models/incremental/merge.sql @@ -0,0 +1,31 @@ +{% macro sqlserver__get_incremental_microbatch_sql(arg_dict) %} + {%- set target = arg_dict["target_relation"] -%} + {%- set source = arg_dict["temp_relation"] -%} + {%- set dest_columns = arg_dict["dest_columns"] -%} + {%- set incremental_predicates = [] if arg_dict.get('incremental_predicates') is none else arg_dict.get('incremental_predicates') -%} + + {#-- Add additional incremental_predicates to filter for batch --#} + {% if model.config.get("__dbt_internal_microbatch_event_time_start") -%} + {{ log("incremenal append event start time > DBT_INTERNAL_TARGET." ~ model.config.event_time ~ " >= parse('" ~ model.config.__dbt_internal_microbatch_event_time_start ~ "' as datetimeoffset)") }} + {% do incremental_predicates.append("DBT_INTERNAL_TARGET." ~ model.config.event_time ~ " >= parse('" ~ model.config.__dbt_internal_microbatch_event_time_start ~ "' as datetimeoffset)") %} + {% endif %} + {% if model.config.__dbt_internal_microbatch_event_time_end -%} + {{ log("incremenal append event end time < DBT_INTERNAL_TARGET." ~ model.config.event_time ~ " < parse('" ~ model.config.__dbt_internal_microbatch_event_time_end ~ "' as datetimeoffset)") }} + {% do incremental_predicates.append("DBT_INTERNAL_TARGET." ~ model.config.event_time ~ " < parse('" ~ model.config.__dbt_internal_microbatch_event_time_end ~ "' as datetimeoffset)") %} + {% endif %} + {% do arg_dict.update({'incremental_predicates': incremental_predicates}) %} + + delete DBT_INTERNAL_TARGET from {{ target }} AS DBT_INTERNAL_TARGET + where ( + {% for predicate in incremental_predicates %} + {%- if not loop.first %}and {% endif -%} {{ predicate }} + {% endfor %} + ); + + {%- set dest_cols_csv = get_quoted_csv(dest_columns | map(attribute="name")) -%} + insert into {{ target }} ({{ dest_cols_csv }}) + ( + select {{ dest_cols_csv }} + from {{ source }} + ) +{% endmacro %} diff --git a/tests/functional/adapter/dbt/test_incremental_microbatch_datetime.py b/tests/functional/adapter/dbt/test_incremental_microbatch_datetime.py new file mode 100644 index 00000000..88581a6a --- /dev/null +++ b/tests/functional/adapter/dbt/test_incremental_microbatch_datetime.py @@ -0,0 +1,47 @@ +import pytest +from dbt.tests.adapter.incremental.test_incremental_microbatch import BaseMicrobatch + +_microbatch_model_no_unique_id_sql_datetime = """ +{{ config(materialized='incremental', incremental_strategy='microbatch', +event_time='event_time', batch_size='day', begin='2020-01-01 00:00:00') }} +select * from {{ ref('input_model') }} +""" + +_input_model_sql_datetime = """ +{{ config(materialized='table', event_time='event_time') }} +select 1 as id, '2020-01-01 00:00:00' as event_time +union all +select 2 as id, '2020-01-02 00:00:00' as event_time +union all +select 3 as id, '2020-01-03 00:00:00' as event_time +""" + + +class TestSQLServerMicrobatchDateTime(BaseMicrobatch): + """ + Setup a version of the microbatch testing that uses a datetime column as the event_time + This is to test that the microbatch strategy can handle datetime columns when passing in + event times as UTC strings + """ + + @pytest.fixture(scope="class") + def microbatch_model_sql(self) -> str: + return _microbatch_model_no_unique_id_sql_datetime + + @pytest.fixture(scope="class") + def input_model_sql(self) -> str: + """ + This is the SQL that defines the input model to the microbatch model, + including any {{ config(..) }}. event_time is a required configuration of this input + """ + return _input_model_sql_datetime + + @pytest.fixture(scope="class") + def insert_two_rows_sql(self, project) -> str: + test_schema_relation = project.adapter.Relation.create( + database=project.database, schema=project.test_schema + ) + return ( + f"insert into {test_schema_relation}.input_model (id, event_time) " + f"values (4, '2020-01-04 00:00:00'), (5, '2020-01-05 00:00:00')" + ) From c8b1b8fe3f5de8f32028dbbf1f02f6b5283cfc6f Mon Sep 17 00:00:00 2001 From: Benjamin Date: Thu, 20 Feb 2025 15:43:10 +0000 Subject: [PATCH 04/11] Update from parse to cast for the handling of the UTC time strings as the usage of the parse function appears to be preventing index usage. --- dbt/adapters/sqlserver/sqlserver_relation.py | 8 ++++---- .../macros/materializations/models/incremental/merge.sql | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/dbt/adapters/sqlserver/sqlserver_relation.py b/dbt/adapters/sqlserver/sqlserver_relation.py index 94be5d26..f95bdd7f 100644 --- a/dbt/adapters/sqlserver/sqlserver_relation.py +++ b/dbt/adapters/sqlserver/sqlserver_relation.py @@ -58,19 +58,19 @@ def _render_event_time_filtered(self, event_time_filter: EventTimeFilter) -> str if event_time_filter.start and event_time_filter.end: filter = ( f"{event_time_filter.field_name} >=" - f" parse('{event_time_filter.start}' as datetimeoffset)" + f" cast('{event_time_filter.start}' as datetimeoffset)" f" and {event_time_filter.field_name} <" - f" parse('{event_time_filter.end}' as datetimeoffset)" + f" cast('{event_time_filter.end}' as datetimeoffset)" ) elif event_time_filter.start: filter = ( f"{event_time_filter.field_name} >=" - f" parse('{event_time_filter.start}' as datetimeoffset)" + f" cast('{event_time_filter.start}' as datetimeoffset)" ) elif event_time_filter.end: filter = ( f"{event_time_filter.field_name} <" - f" parse('{event_time_filter.end}' as datetimeoffset)" + f" cast('{event_time_filter.end}' as datetimeoffset)" ) return filter diff --git a/dbt/include/sqlserver/macros/materializations/models/incremental/merge.sql b/dbt/include/sqlserver/macros/materializations/models/incremental/merge.sql index 823b5b7e..9d8cdc0f 100644 --- a/dbt/include/sqlserver/macros/materializations/models/incremental/merge.sql +++ b/dbt/include/sqlserver/macros/materializations/models/incremental/merge.sql @@ -6,12 +6,12 @@ {#-- Add additional incremental_predicates to filter for batch --#} {% if model.config.get("__dbt_internal_microbatch_event_time_start") -%} - {{ log("incremenal append event start time > DBT_INTERNAL_TARGET." ~ model.config.event_time ~ " >= parse('" ~ model.config.__dbt_internal_microbatch_event_time_start ~ "' as datetimeoffset)") }} - {% do incremental_predicates.append("DBT_INTERNAL_TARGET." ~ model.config.event_time ~ " >= parse('" ~ model.config.__dbt_internal_microbatch_event_time_start ~ "' as datetimeoffset)") %} + {{ log("incremental append event start time > DBT_INTERNAL_TARGET." ~ model.config.event_time ~ " >= cast('" ~ model.config.__dbt_internal_microbatch_event_time_start ~ "' as datetimeoffset)") }} + {% do incremental_predicates.append("DBT_INTERNAL_TARGET." ~ model.config.event_time ~ " >= cast('" ~ model.config.__dbt_internal_microbatch_event_time_start ~ "' as datetimeoffset)") %} {% endif %} {% if model.config.__dbt_internal_microbatch_event_time_end -%} - {{ log("incremenal append event end time < DBT_INTERNAL_TARGET." ~ model.config.event_time ~ " < parse('" ~ model.config.__dbt_internal_microbatch_event_time_end ~ "' as datetimeoffset)") }} - {% do incremental_predicates.append("DBT_INTERNAL_TARGET." ~ model.config.event_time ~ " < parse('" ~ model.config.__dbt_internal_microbatch_event_time_end ~ "' as datetimeoffset)") %} + {{ log("incremental append event end time < DBT_INTERNAL_TARGET." ~ model.config.event_time ~ " < cast('" ~ model.config.__dbt_internal_microbatch_event_time_end ~ "' as datetimeoffset)") }} + {% do incremental_predicates.append("DBT_INTERNAL_TARGET." ~ model.config.event_time ~ " < cast('" ~ model.config.__dbt_internal_microbatch_event_time_end ~ "' as datetimeoffset)") %} {% endif %} {% do arg_dict.update({'incremental_predicates': incremental_predicates}) %} From 38f9bf9ca755144c0f3f7803f0dd5b971742af22 Mon Sep 17 00:00:00 2001 From: Benjamin Date: Sat, 1 Mar 2025 23:46:33 +0000 Subject: [PATCH 05/11] Update the SQL server adapter to override the supported incremental strategies that are set in the Fabric adapater to add back in merge. There are no macros in either the Fabric or SQLServer adapater for the merge type, its all handled by the default DBT implementation. --- dbt/adapters/sqlserver/sqlserver_adapter.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/dbt/adapters/sqlserver/sqlserver_adapter.py b/dbt/adapters/sqlserver/sqlserver_adapter.py index 646e5e23..6f05c501 100644 --- a/dbt/adapters/sqlserver/sqlserver_adapter.py +++ b/dbt/adapters/sqlserver/sqlserver_adapter.py @@ -59,3 +59,9 @@ def render_model_constraint(cls, constraint) -> Optional[str]: @classmethod def date_function(cls): return "getdate()" + + def valid_incremental_strategies(self): + """The set of standard builtin strategies which this adapter supports out-of-the-box. + Not used to validate custom strategies defined by end users. + """ + return ["append", "delete+insert", "merge", "microbatch"] From 3237b6539e8aba8ba8be9877fdae0f5dd1cefc34 Mon Sep 17 00:00:00 2001 From: Benjamin Date: Thu, 27 Mar 2025 11:37:17 +0000 Subject: [PATCH 06/11] Reimplement macros which have been converted into versions inside the Fabric adapter which generate nested CTEs which cannot run on SQL server. --- .../sqlserver/macros/adapter/columns.sql | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/dbt/include/sqlserver/macros/adapter/columns.sql b/dbt/include/sqlserver/macros/adapter/columns.sql index 205ebefb..a98750e7 100644 --- a/dbt/include/sqlserver/macros/adapter/columns.sql +++ b/dbt/include/sqlserver/macros/adapter/columns.sql @@ -1,3 +1,28 @@ +{% macro sqlserver__get_empty_subquery_sql(select_sql, select_sql_header=none) %} + {% if select_sql.strip().lower().startswith('with') %} + {{ select_sql }} + {% else -%} + select * from ( + {{ select_sql }} + ) dbt_sbq_tmp + where 1 = 0 + {%- endif -%} + +{% endmacro %} + +{% macro sqlserver__get_columns_in_query(select_sql) %} + {% set query_label = apply_label() %} + {% call statement('get_columns_in_query', fetch_result=True, auto_begin=False) -%} + select TOP 0 * from ( + {{ select_sql }} + ) as __dbt_sbq + where 0 = 1 + {{ query_label }} + {% endcall %} + + {{ return(load_result('get_columns_in_query').table.columns | map(attribute='name') | list) }} +{% endmacro %} + {% macro sqlserver__alter_column_type(relation, column_name, new_column_type) %} {%- set tmp_column = column_name + "__dbt_alter" -%} From 0a30302fbd8e5220b1b469bd5d149a84ab60f987 Mon Sep 17 00:00:00 2001 From: Benjamin Date: Wed, 2 Apr 2025 08:13:10 +0000 Subject: [PATCH 07/11] Unpin some requirements so pip can resolve the dependencies. --- dev_requirements.txt | 2 +- setup.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dev_requirements.txt b/dev_requirements.txt index acde42fe..36514cc0 100644 --- a/dev_requirements.txt +++ b/dev_requirements.txt @@ -1,5 +1,5 @@ -dbt-tests-adapter>=1.9.0 +dbt-tests-adapter ruff black==24.8.0 diff --git a/setup.py b/setup.py index 05b5bb2a..5f57d8ba 100644 --- a/setup.py +++ b/setup.py @@ -66,8 +66,8 @@ def run(self): packages=find_namespace_packages(include=["dbt", "dbt.*"]), include_package_data=True, install_requires=[ - "dbt-fabric>=1.9.0,<1.10.0", - "dbt-core>=1.9.0,<1.10.0", + "dbt-fabric>=1.9.0", + "dbt-core>=1.9.0", "dbt-common>=1.0,<2.0", "dbt-adapters>=1.11.0,<2.0", ], From dee3355934fe52208c4593c724c5babd9248f87d Mon Sep 17 00:00:00 2001 From: Benjamin Date: Thu, 10 Apr 2025 14:36:17 +0000 Subject: [PATCH 08/11] Pin dbt-fabric version as they can introduce breaking changes now. Update the dbt-core reference to be anything less than v2 now that dbt-core versions are uncoupled from adapater versions --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 5f57d8ba..0a63ce6d 100644 --- a/setup.py +++ b/setup.py @@ -66,8 +66,8 @@ def run(self): packages=find_namespace_packages(include=["dbt", "dbt.*"]), include_package_data=True, install_requires=[ - "dbt-fabric>=1.9.0", - "dbt-core>=1.9.0", + "dbt-fabric==1.9.3", + "dbt-core>=1.9.0,<2.0", "dbt-common>=1.0,<2.0", "dbt-adapters>=1.11.0,<2.0", ], From 9fc978b6da0d815090e11e8df0fdcf5474c3916f Mon Sep 17 00:00:00 2001 From: Benjamin Date: Fri, 11 Apr 2025 22:07:55 +0000 Subject: [PATCH 09/11] Update dbt-tests-adapater versioning to try and get github tests building properly. --- dev_requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev_requirements.txt b/dev_requirements.txt index 36514cc0..2a3c4c4a 100644 --- a/dev_requirements.txt +++ b/dev_requirements.txt @@ -1,5 +1,5 @@ -dbt-tests-adapter +dbt-tests-adapter>=1.9.0,<2.0 ruff black==24.8.0 From 2e8cb40ef98cba19322cb900205203b1a8138bf6 Mon Sep 17 00:00:00 2001 From: Benjamin Date: Sat, 12 Apr 2025 17:23:03 +0000 Subject: [PATCH 10/11] Remove testing on Python 3.8, DBT core does not support it. --- .github/workflows/integration-tests-sqlserver.yml | 2 +- .github/workflows/unit-tests.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/integration-tests-sqlserver.yml b/.github/workflows/integration-tests-sqlserver.yml index f821d1b0..5c7694a6 100644 --- a/.github/workflows/integration-tests-sqlserver.yml +++ b/.github/workflows/integration-tests-sqlserver.yml @@ -18,7 +18,7 @@ jobs: name: Regular strategy: matrix: - python_version: ["3.8", "3.9", "3.10", "3.11", "3.12"] + python_version: ["3.9", "3.10", "3.11", "3.12"] msodbc_version: ["17", "18"] sqlserver_version: ["2017", "2019", "2022"] collation: ["SQL_Latin1_General_CP1_CS_AS", "SQL_Latin1_General_CP1_CI_AS"] diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index a04ecc1b..5acae556 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -18,7 +18,7 @@ jobs: name: Unit tests strategy: matrix: - python_version: ["3.8", "3.9", "3.10", "3.11", "3.12"] + python_version: ["3.9", "3.10", "3.11", "3.12"] runs-on: ubuntu-latest permissions: contents: read From 1b49c77cb440275bbdad0a29873a31aa8a03a4c4 Mon Sep 17 00:00:00 2001 From: Benjamin Date: Fri, 9 May 2025 11:30:49 +0000 Subject: [PATCH 11/11] Update to remove the publishing of docker images for python versions not supported by this project any longer. --- .github/workflows/publish-docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish-docker.yml b/.github/workflows/publish-docker.yml index 4a312ea3..63b1f5c4 100644 --- a/.github/workflows/publish-docker.yml +++ b/.github/workflows/publish-docker.yml @@ -12,7 +12,7 @@ jobs: publish-docker-client: strategy: matrix: - python_version: ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12"] + python_version: ["3.9", "3.10", "3.11", "3.12"] docker_target: ["msodbc17", "msodbc18"] runs-on: ubuntu-latest permissions: