diff options
| author | mike bayer <mike_mp@zzzcomputing.com> | 2022-08-24 17:00:25 +0000 |
|---|---|---|
| committer | Gerrit Code Review <gerrit@ci3.zzzcomputing.com> | 2022-08-24 17:00:25 +0000 |
| commit | e475f8f4b136ff52a97e002e96b65880bc9f59bf (patch) | |
| tree | 08406c47e9ecde77ebf2a3bb02b22b5765526a1b /lib/sqlalchemy | |
| parent | 27bf1c1c287debb69c4644bf6dc35e3bad5470ad (diff) | |
| parent | 08c96ff74c36b471724e7d161bdc594f21893b33 (diff) | |
| download | sqlalchemy-e475f8f4b136ff52a97e002e96b65880bc9f59bf.tar.gz | |
Merge "include mssql_clustered dialect_options when reflecting - issue #8288" into main
Diffstat (limited to 'lib/sqlalchemy')
| -rw-r--r-- | lib/sqlalchemy/dialects/mssql/base.py | 23 | ||||
| -rw-r--r-- | lib/sqlalchemy/testing/suite/test_reflection.py | 13 |
2 files changed, 30 insertions, 6 deletions
diff --git a/lib/sqlalchemy/dialects/mssql/base.py b/lib/sqlalchemy/dialects/mssql/base.py index c85d21ef7..94e082611 100644 --- a/lib/sqlalchemy/dialects/mssql/base.py +++ b/lib/sqlalchemy/dialects/mssql/base.py @@ -3218,6 +3218,9 @@ class MSDialect(default.DefaultDialect): rp = connection.execution_options(future_result=True).execute( sql.text( "select ind.index_id, ind.is_unique, ind.name, " + "case when ind.index_id = 1 " + "then cast(1 as bit) " + "else cast(0 as bit) end as is_clustered, " f"{filter_definition} " "from sys.indexes as ind join sys.tables as tab on " "ind.object_id=tab.object_id " @@ -3240,6 +3243,7 @@ class MSDialect(default.DefaultDialect): "unique": row["is_unique"] == 1, "column_names": [], "include_columns": [], + "dialect_options": {"mssql_clustered": row["is_clustered"]}, } if row["filter_definition"] is not None: @@ -3566,7 +3570,15 @@ class MSDialect(default.DefaultDialect): # Primary key constraints s = ( sql.select( - C.c.column_name, TC.c.constraint_type, C.c.constraint_name + C.c.column_name, + TC.c.constraint_type, + C.c.constraint_name, + func.objectproperty( + func.object_id( + C.c.table_schema + "." + C.c.constraint_name + ), + "CnstIsClustKey", + ).label("is_clustered"), ) .where( sql.and_( @@ -3580,13 +3592,20 @@ class MSDialect(default.DefaultDialect): ) c = connection.execution_options(future_result=True).execute(s) constraint_name = None + is_clustered = None for row in c.mappings(): if "PRIMARY" in row[TC.c.constraint_type.name]: pkeys.append(row["COLUMN_NAME"]) if constraint_name is None: constraint_name = row[C.c.constraint_name.name] + if is_clustered is None: + is_clustered = row["is_clustered"] if pkeys: - return {"constrained_columns": pkeys, "name": constraint_name} + return { + "constrained_columns": pkeys, + "name": constraint_name, + "dialect_options": {"mssql_clustered": is_clustered}, + } else: return self._default_or_error( connection, diff --git a/lib/sqlalchemy/testing/suite/test_reflection.py b/lib/sqlalchemy/testing/suite/test_reflection.py index a3737a91a..7e54ee57a 100644 --- a/lib/sqlalchemy/testing/suite/test_reflection.py +++ b/lib/sqlalchemy/testing/suite/test_reflection.py @@ -2396,20 +2396,25 @@ class ComponentReflectionTestExtra(ComparesIndexes, fixtures.TestBase): insp = inspect(connection) + get_indexes = insp.get_indexes("t") eq_( - insp.get_indexes("t"), + get_indexes, [ { "name": "t_idx", "column_names": ["x"], "include_columns": ["y"], "unique": False, - "dialect_options": { - "%s_include" % connection.engine.name: ["y"] - }, + "dialect_options": mock.ANY, } ], ) + eq_( + get_indexes[0]["dialect_options"][ + "%s_include" % connection.engine.name + ], + ["y"], + ) t2 = Table("t", MetaData(), autoload_with=connection) eq_( |
