information_schema.py 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. # dialects/mssql/information_schema.py
  2. # Copyright (C) 2005-2025 the SQLAlchemy authors and contributors
  3. # <see AUTHORS file>
  4. #
  5. # This module is part of SQLAlchemy and is released under
  6. # the MIT License: https://www.opensource.org/licenses/mit-license.php
  7. # mypy: ignore-errors
  8. from ... import cast
  9. from ... import Column
  10. from ... import MetaData
  11. from ... import Table
  12. from ...ext.compiler import compiles
  13. from ...sql import expression
  14. from ...types import Boolean
  15. from ...types import Integer
  16. from ...types import Numeric
  17. from ...types import NVARCHAR
  18. from ...types import String
  19. from ...types import TypeDecorator
  20. from ...types import Unicode
  21. ischema = MetaData()
  22. class CoerceUnicode(TypeDecorator):
  23. impl = Unicode
  24. cache_ok = True
  25. def bind_expression(self, bindvalue):
  26. return _cast_on_2005(bindvalue)
  27. class _cast_on_2005(expression.ColumnElement):
  28. def __init__(self, bindvalue):
  29. self.bindvalue = bindvalue
  30. @compiles(_cast_on_2005)
  31. def _compile(element, compiler, **kw):
  32. from . import base
  33. if (
  34. compiler.dialect.server_version_info is None
  35. or compiler.dialect.server_version_info < base.MS_2005_VERSION
  36. ):
  37. return compiler.process(element.bindvalue, **kw)
  38. else:
  39. return compiler.process(cast(element.bindvalue, Unicode), **kw)
  40. schemata = Table(
  41. "SCHEMATA",
  42. ischema,
  43. Column("CATALOG_NAME", CoerceUnicode, key="catalog_name"),
  44. Column("SCHEMA_NAME", CoerceUnicode, key="schema_name"),
  45. Column("SCHEMA_OWNER", CoerceUnicode, key="schema_owner"),
  46. schema="INFORMATION_SCHEMA",
  47. )
  48. tables = Table(
  49. "TABLES",
  50. ischema,
  51. Column("TABLE_CATALOG", CoerceUnicode, key="table_catalog"),
  52. Column("TABLE_SCHEMA", CoerceUnicode, key="table_schema"),
  53. Column("TABLE_NAME", CoerceUnicode, key="table_name"),
  54. Column("TABLE_TYPE", CoerceUnicode, key="table_type"),
  55. schema="INFORMATION_SCHEMA",
  56. )
  57. columns = Table(
  58. "COLUMNS",
  59. ischema,
  60. Column("TABLE_SCHEMA", CoerceUnicode, key="table_schema"),
  61. Column("TABLE_NAME", CoerceUnicode, key="table_name"),
  62. Column("COLUMN_NAME", CoerceUnicode, key="column_name"),
  63. Column("IS_NULLABLE", Integer, key="is_nullable"),
  64. Column("DATA_TYPE", String, key="data_type"),
  65. Column("ORDINAL_POSITION", Integer, key="ordinal_position"),
  66. Column(
  67. "CHARACTER_MAXIMUM_LENGTH", Integer, key="character_maximum_length"
  68. ),
  69. Column("NUMERIC_PRECISION", Integer, key="numeric_precision"),
  70. Column("NUMERIC_SCALE", Integer, key="numeric_scale"),
  71. Column("COLUMN_DEFAULT", Integer, key="column_default"),
  72. Column("COLLATION_NAME", String, key="collation_name"),
  73. schema="INFORMATION_SCHEMA",
  74. )
  75. sys_columns = Table(
  76. "columns",
  77. ischema,
  78. Column("object_id", Integer),
  79. Column("name", CoerceUnicode),
  80. Column("column_id", Integer),
  81. Column("default_object_id", Integer),
  82. Column("user_type_id", Integer),
  83. Column("is_nullable", Integer),
  84. Column("ordinal_position", Integer),
  85. Column("max_length", Integer),
  86. Column("precision", Integer),
  87. Column("scale", Integer),
  88. Column("collation_name", String),
  89. schema="sys",
  90. )
  91. sys_types = Table(
  92. "types",
  93. ischema,
  94. Column("name", CoerceUnicode, key="name"),
  95. Column("system_type_id", Integer, key="system_type_id"),
  96. Column("user_type_id", Integer, key="user_type_id"),
  97. Column("schema_id", Integer, key="schema_id"),
  98. Column("max_length", Integer, key="max_length"),
  99. Column("precision", Integer, key="precision"),
  100. Column("scale", Integer, key="scale"),
  101. Column("collation_name", CoerceUnicode, key="collation_name"),
  102. Column("is_nullable", Boolean, key="is_nullable"),
  103. Column("is_user_defined", Boolean, key="is_user_defined"),
  104. Column("is_assembly_type", Boolean, key="is_assembly_type"),
  105. Column("default_object_id", Integer, key="default_object_id"),
  106. Column("rule_object_id", Integer, key="rule_object_id"),
  107. Column("is_table_type", Boolean, key="is_table_type"),
  108. schema="sys",
  109. )
  110. constraints = Table(
  111. "TABLE_CONSTRAINTS",
  112. ischema,
  113. Column("TABLE_SCHEMA", CoerceUnicode, key="table_schema"),
  114. Column("TABLE_NAME", CoerceUnicode, key="table_name"),
  115. Column("CONSTRAINT_NAME", CoerceUnicode, key="constraint_name"),
  116. Column("CONSTRAINT_TYPE", CoerceUnicode, key="constraint_type"),
  117. schema="INFORMATION_SCHEMA",
  118. )
  119. sys_default_constraints = Table(
  120. "default_constraints",
  121. ischema,
  122. Column("object_id", Integer),
  123. Column("name", CoerceUnicode),
  124. Column("schema_id", Integer),
  125. Column("parent_column_id", Integer),
  126. Column("definition", CoerceUnicode),
  127. schema="sys",
  128. )
  129. column_constraints = Table(
  130. "CONSTRAINT_COLUMN_USAGE",
  131. ischema,
  132. Column("TABLE_SCHEMA", CoerceUnicode, key="table_schema"),
  133. Column("TABLE_NAME", CoerceUnicode, key="table_name"),
  134. Column("COLUMN_NAME", CoerceUnicode, key="column_name"),
  135. Column("CONSTRAINT_NAME", CoerceUnicode, key="constraint_name"),
  136. schema="INFORMATION_SCHEMA",
  137. )
  138. key_constraints = Table(
  139. "KEY_COLUMN_USAGE",
  140. ischema,
  141. Column("TABLE_SCHEMA", CoerceUnicode, key="table_schema"),
  142. Column("TABLE_NAME", CoerceUnicode, key="table_name"),
  143. Column("COLUMN_NAME", CoerceUnicode, key="column_name"),
  144. Column("CONSTRAINT_NAME", CoerceUnicode, key="constraint_name"),
  145. Column("CONSTRAINT_SCHEMA", CoerceUnicode, key="constraint_schema"),
  146. Column("ORDINAL_POSITION", Integer, key="ordinal_position"),
  147. schema="INFORMATION_SCHEMA",
  148. )
  149. ref_constraints = Table(
  150. "REFERENTIAL_CONSTRAINTS",
  151. ischema,
  152. Column("CONSTRAINT_CATALOG", CoerceUnicode, key="constraint_catalog"),
  153. Column("CONSTRAINT_SCHEMA", CoerceUnicode, key="constraint_schema"),
  154. Column("CONSTRAINT_NAME", CoerceUnicode, key="constraint_name"),
  155. # TODO: is CATLOG misspelled ?
  156. Column(
  157. "UNIQUE_CONSTRAINT_CATLOG",
  158. CoerceUnicode,
  159. key="unique_constraint_catalog",
  160. ),
  161. Column(
  162. "UNIQUE_CONSTRAINT_SCHEMA",
  163. CoerceUnicode,
  164. key="unique_constraint_schema",
  165. ),
  166. Column(
  167. "UNIQUE_CONSTRAINT_NAME", CoerceUnicode, key="unique_constraint_name"
  168. ),
  169. Column("MATCH_OPTION", String, key="match_option"),
  170. Column("UPDATE_RULE", String, key="update_rule"),
  171. Column("DELETE_RULE", String, key="delete_rule"),
  172. schema="INFORMATION_SCHEMA",
  173. )
  174. views = Table(
  175. "VIEWS",
  176. ischema,
  177. Column("TABLE_CATALOG", CoerceUnicode, key="table_catalog"),
  178. Column("TABLE_SCHEMA", CoerceUnicode, key="table_schema"),
  179. Column("TABLE_NAME", CoerceUnicode, key="table_name"),
  180. Column("VIEW_DEFINITION", CoerceUnicode, key="view_definition"),
  181. Column("CHECK_OPTION", String, key="check_option"),
  182. Column("IS_UPDATABLE", String, key="is_updatable"),
  183. schema="INFORMATION_SCHEMA",
  184. )
  185. computed_columns = Table(
  186. "computed_columns",
  187. ischema,
  188. Column("object_id", Integer),
  189. Column("name", CoerceUnicode),
  190. Column("column_id", Integer),
  191. Column("is_computed", Boolean),
  192. Column("is_persisted", Boolean),
  193. Column("definition", CoerceUnicode),
  194. schema="sys",
  195. )
  196. sequences = Table(
  197. "SEQUENCES",
  198. ischema,
  199. Column("SEQUENCE_CATALOG", CoerceUnicode, key="sequence_catalog"),
  200. Column("SEQUENCE_SCHEMA", CoerceUnicode, key="sequence_schema"),
  201. Column("SEQUENCE_NAME", CoerceUnicode, key="sequence_name"),
  202. schema="INFORMATION_SCHEMA",
  203. )
  204. class NumericSqlVariant(TypeDecorator):
  205. r"""This type casts sql_variant columns in the identity_columns view
  206. to numeric. This is required because:
  207. * pyodbc does not support sql_variant
  208. * pymssql under python 2 return the byte representation of the number,
  209. int 1 is returned as "\x01\x00\x00\x00". On python 3 it returns the
  210. correct value as string.
  211. """
  212. impl = Unicode
  213. cache_ok = True
  214. def column_expression(self, colexpr):
  215. return cast(colexpr, Numeric(38, 0))
  216. identity_columns = Table(
  217. "identity_columns",
  218. ischema,
  219. Column("object_id", Integer),
  220. Column("name", CoerceUnicode),
  221. Column("column_id", Integer),
  222. Column("is_identity", Boolean),
  223. Column("seed_value", NumericSqlVariant),
  224. Column("increment_value", NumericSqlVariant),
  225. Column("last_value", NumericSqlVariant),
  226. Column("is_not_for_replication", Boolean),
  227. schema="sys",
  228. )
  229. class NVarcharSqlVariant(TypeDecorator):
  230. """This type casts sql_variant columns in the extended_properties view
  231. to nvarchar. This is required because pyodbc does not support sql_variant
  232. """
  233. impl = Unicode
  234. cache_ok = True
  235. def column_expression(self, colexpr):
  236. return cast(colexpr, NVARCHAR)
  237. extended_properties = Table(
  238. "extended_properties",
  239. ischema,
  240. Column("class", Integer), # TINYINT
  241. Column("class_desc", CoerceUnicode),
  242. Column("major_id", Integer),
  243. Column("minor_id", Integer),
  244. Column("name", CoerceUnicode),
  245. Column("value", NVarcharSqlVariant),
  246. schema="sys",
  247. )