From: Edgar Ramírez Mondragón Date: Thu, 18 Dec 2025 04:11:33 +0000 (-0600) Subject: Support for `IF EXISTS` in SQL Server 2016 (13.x) and later versions X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=34e950765e9857fcf968d2c23db0082c866671aa;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Support for `IF EXISTS` in SQL Server 2016 (13.x) and later versions Fixes: #13045 Signed-off-by: Edgar Ramírez Mondragón --- diff --git a/lib/sqlalchemy/dialects/mssql/base.py b/lib/sqlalchemy/dialects/mssql/base.py index 94f265ebed..256f975fde 100644 --- a/lib/sqlalchemy/dialects/mssql/base.py +++ b/lib/sqlalchemy/dialects/mssql/base.py @@ -963,6 +963,7 @@ import codecs import datetime import operator import re +from typing import Any from typing import Literal from typing import overload from typing import TYPE_CHECKING @@ -1014,6 +1015,7 @@ from ...types import VARCHAR from ...util import update_wrapper if TYPE_CHECKING: + from ...sql.ddl import DropIndex from ...sql.dml import DMLState from ...sql.selectable import TableClause @@ -2688,11 +2690,21 @@ class MSDDLCompiler(compiler.DDLCompiler): return text - def visit_drop_index(self, drop, **kw): - return "\nDROP INDEX %s ON %s" % ( - self._prepared_index_name(drop.element, include_schema=False), - self.preparer.format_table(drop.element.table), - ) + def visit_drop_index(self, drop: DropIndex, **kw: Any) -> str: + index = drop.element + + text = "\nDROP INDEX " + + if ( + # only supported in 2016+ + self.dialect.server_version_info < MS_2016_VERSION + and drop.if_exists + ): + text += "IF EXISTS " + + text += self._prepared_index_name(index, include_schema=False) + text += " ON " + self.preparer.format_table(index.table) + return text def visit_create_table_as(self, element, **kw): prep = self.preparer diff --git a/test/dialect/mssql/test_compiler.py b/test/dialect/mssql/test_compiler.py index f8d9d54886..30e7f79a29 100644 --- a/test/dialect/mssql/test_compiler.py +++ b/test/dialect/mssql/test_compiler.py @@ -1534,6 +1534,14 @@ class CompileTest(fixtures.TestBase, AssertsCompiledSQL): "DROP INDEX idx_foo ON bar.foo", ) + def test_drop_index_if_exists(self): + m = MetaData() + t1 = Table("foo", m, Column("x", Integer), schema="bar") + self.assert_compile( + schema.DropIndex(Index("idx_foo", t1.c.x), if_exists=True), + "DROP INDEX IF EXISTS idx_foo ON bar.foo", + ) + def test_index_extra_include_1(self): metadata = MetaData() tbl = Table(