SQLAlchemy 2.0.36__cp313-cp313-win32.whl

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 (273) hide show
  1. SQLAlchemy-2.0.36.dist-info/LICENSE +19 -0
  2. SQLAlchemy-2.0.36.dist-info/METADATA +243 -0
  3. SQLAlchemy-2.0.36.dist-info/RECORD +273 -0
  4. SQLAlchemy-2.0.36.dist-info/WHEEL +5 -0
  5. SQLAlchemy-2.0.36.dist-info/top_level.txt +1 -0
  6. sqlalchemy/__init__.py +294 -0
  7. sqlalchemy/connectors/__init__.py +18 -0
  8. sqlalchemy/connectors/aioodbc.py +174 -0
  9. sqlalchemy/connectors/asyncio.py +213 -0
  10. sqlalchemy/connectors/pyodbc.py +249 -0
  11. sqlalchemy/cyextension/__init__.py +6 -0
  12. sqlalchemy/cyextension/collections.cp313-win32.pyd +0 -0
  13. sqlalchemy/cyextension/collections.pyx +409 -0
  14. sqlalchemy/cyextension/immutabledict.cp313-win32.pyd +0 -0
  15. sqlalchemy/cyextension/immutabledict.pxd +8 -0
  16. sqlalchemy/cyextension/immutabledict.pyx +133 -0
  17. sqlalchemy/cyextension/processors.cp313-win32.pyd +0 -0
  18. sqlalchemy/cyextension/processors.pyx +68 -0
  19. sqlalchemy/cyextension/resultproxy.cp313-win32.pyd +0 -0
  20. sqlalchemy/cyextension/resultproxy.pyx +102 -0
  21. sqlalchemy/cyextension/util.cp313-win32.pyd +0 -0
  22. sqlalchemy/cyextension/util.pyx +91 -0
  23. sqlalchemy/dialects/__init__.py +61 -0
  24. sqlalchemy/dialects/_typing.py +25 -0
  25. sqlalchemy/dialects/mssql/__init__.py +88 -0
  26. sqlalchemy/dialects/mssql/aioodbc.py +64 -0
  27. sqlalchemy/dialects/mssql/base.py +4010 -0
  28. sqlalchemy/dialects/mssql/information_schema.py +254 -0
  29. sqlalchemy/dialects/mssql/json.py +133 -0
  30. sqlalchemy/dialects/mssql/provision.py +162 -0
  31. sqlalchemy/dialects/mssql/pymssql.py +126 -0
  32. sqlalchemy/dialects/mssql/pyodbc.py +745 -0
  33. sqlalchemy/dialects/mysql/__init__.py +101 -0
  34. sqlalchemy/dialects/mysql/aiomysql.py +333 -0
  35. sqlalchemy/dialects/mysql/asyncmy.py +337 -0
  36. sqlalchemy/dialects/mysql/base.py +3494 -0
  37. sqlalchemy/dialects/mysql/cymysql.py +84 -0
  38. sqlalchemy/dialects/mysql/dml.py +219 -0
  39. sqlalchemy/dialects/mysql/enumerated.py +244 -0
  40. sqlalchemy/dialects/mysql/expression.py +141 -0
  41. sqlalchemy/dialects/mysql/json.py +81 -0
  42. sqlalchemy/dialects/mysql/mariadb.py +32 -0
  43. sqlalchemy/dialects/mysql/mariadbconnector.py +277 -0
  44. sqlalchemy/dialects/mysql/mysqlconnector.py +180 -0
  45. sqlalchemy/dialects/mysql/mysqldb.py +303 -0
  46. sqlalchemy/dialects/mysql/provision.py +110 -0
  47. sqlalchemy/dialects/mysql/pymysql.py +137 -0
  48. sqlalchemy/dialects/mysql/pyodbc.py +138 -0
  49. sqlalchemy/dialects/mysql/reflection.py +677 -0
  50. sqlalchemy/dialects/mysql/reserved_words.py +571 -0
  51. sqlalchemy/dialects/mysql/types.py +774 -0
  52. sqlalchemy/dialects/oracle/__init__.py +67 -0
  53. sqlalchemy/dialects/oracle/base.py +3271 -0
  54. sqlalchemy/dialects/oracle/cx_oracle.py +1483 -0
  55. sqlalchemy/dialects/oracle/dictionary.py +507 -0
  56. sqlalchemy/dialects/oracle/oracledb.py +431 -0
  57. sqlalchemy/dialects/oracle/provision.py +220 -0
  58. sqlalchemy/dialects/oracle/types.py +287 -0
  59. sqlalchemy/dialects/postgresql/__init__.py +167 -0
  60. sqlalchemy/dialects/postgresql/_psycopg_common.py +187 -0
  61. sqlalchemy/dialects/postgresql/array.py +425 -0
  62. sqlalchemy/dialects/postgresql/asyncpg.py +1274 -0
  63. sqlalchemy/dialects/postgresql/base.py +5008 -0
  64. sqlalchemy/dialects/postgresql/dml.py +310 -0
  65. sqlalchemy/dialects/postgresql/ext.py +496 -0
  66. sqlalchemy/dialects/postgresql/hstore.py +397 -0
  67. sqlalchemy/dialects/postgresql/json.py +333 -0
  68. sqlalchemy/dialects/postgresql/named_types.py +509 -0
  69. sqlalchemy/dialects/postgresql/operators.py +129 -0
  70. sqlalchemy/dialects/postgresql/pg8000.py +662 -0
  71. sqlalchemy/dialects/postgresql/pg_catalog.py +300 -0
  72. sqlalchemy/dialects/postgresql/provision.py +175 -0
  73. sqlalchemy/dialects/postgresql/psycopg.py +772 -0
  74. sqlalchemy/dialects/postgresql/psycopg2.py +886 -0
  75. sqlalchemy/dialects/postgresql/psycopg2cffi.py +61 -0
  76. sqlalchemy/dialects/postgresql/ranges.py +1029 -0
  77. sqlalchemy/dialects/postgresql/types.py +303 -0
  78. sqlalchemy/dialects/sqlite/__init__.py +57 -0
  79. sqlalchemy/dialects/sqlite/aiosqlite.py +396 -0
  80. sqlalchemy/dialects/sqlite/base.py +2805 -0
  81. sqlalchemy/dialects/sqlite/dml.py +240 -0
  82. sqlalchemy/dialects/sqlite/json.py +92 -0
  83. sqlalchemy/dialects/sqlite/provision.py +198 -0
  84. sqlalchemy/dialects/sqlite/pysqlcipher.py +155 -0
  85. sqlalchemy/dialects/sqlite/pysqlite.py +756 -0
  86. sqlalchemy/dialects/type_migration_guidelines.txt +145 -0
  87. sqlalchemy/engine/__init__.py +62 -0
  88. sqlalchemy/engine/_py_processors.py +136 -0
  89. sqlalchemy/engine/_py_row.py +128 -0
  90. sqlalchemy/engine/_py_util.py +74 -0
  91. sqlalchemy/engine/base.py +3375 -0
  92. sqlalchemy/engine/characteristics.py +155 -0
  93. sqlalchemy/engine/create.py +875 -0
  94. sqlalchemy/engine/cursor.py +2181 -0
  95. sqlalchemy/engine/default.py +2365 -0
  96. sqlalchemy/engine/events.py +951 -0
  97. sqlalchemy/engine/interfaces.py +3403 -0
  98. sqlalchemy/engine/mock.py +131 -0
  99. sqlalchemy/engine/processors.py +61 -0
  100. sqlalchemy/engine/reflection.py +2098 -0
  101. sqlalchemy/engine/result.py +2382 -0
  102. sqlalchemy/engine/row.py +401 -0
  103. sqlalchemy/engine/strategies.py +19 -0
  104. sqlalchemy/engine/url.py +910 -0
  105. sqlalchemy/engine/util.py +167 -0
  106. sqlalchemy/event/__init__.py +25 -0
  107. sqlalchemy/event/api.py +225 -0
  108. sqlalchemy/event/attr.py +655 -0
  109. sqlalchemy/event/base.py +470 -0
  110. sqlalchemy/event/legacy.py +246 -0
  111. sqlalchemy/event/registry.py +386 -0
  112. sqlalchemy/events.py +17 -0
  113. sqlalchemy/exc.py +830 -0
  114. sqlalchemy/ext/__init__.py +11 -0
  115. sqlalchemy/ext/associationproxy.py +2013 -0
  116. sqlalchemy/ext/asyncio/__init__.py +25 -0
  117. sqlalchemy/ext/asyncio/base.py +279 -0
  118. sqlalchemy/ext/asyncio/engine.py +1466 -0
  119. sqlalchemy/ext/asyncio/exc.py +21 -0
  120. sqlalchemy/ext/asyncio/result.py +961 -0
  121. sqlalchemy/ext/asyncio/scoping.py +1614 -0
  122. sqlalchemy/ext/asyncio/session.py +1936 -0
  123. sqlalchemy/ext/automap.py +1691 -0
  124. sqlalchemy/ext/baked.py +574 -0
  125. sqlalchemy/ext/compiler.py +570 -0
  126. sqlalchemy/ext/declarative/__init__.py +65 -0
  127. sqlalchemy/ext/declarative/extensions.py +548 -0
  128. sqlalchemy/ext/horizontal_shard.py +481 -0
  129. sqlalchemy/ext/hybrid.py +1514 -0
  130. sqlalchemy/ext/indexable.py +341 -0
  131. sqlalchemy/ext/instrumentation.py +450 -0
  132. sqlalchemy/ext/mutable.py +1073 -0
  133. sqlalchemy/ext/mypy/__init__.py +6 -0
  134. sqlalchemy/ext/mypy/apply.py +320 -0
  135. sqlalchemy/ext/mypy/decl_class.py +515 -0
  136. sqlalchemy/ext/mypy/infer.py +590 -0
  137. sqlalchemy/ext/mypy/names.py +335 -0
  138. sqlalchemy/ext/mypy/plugin.py +303 -0
  139. sqlalchemy/ext/mypy/util.py +357 -0
  140. sqlalchemy/ext/orderinglist.py +416 -0
  141. sqlalchemy/ext/serializer.py +181 -0
  142. sqlalchemy/future/__init__.py +16 -0
  143. sqlalchemy/future/engine.py +15 -0
  144. sqlalchemy/inspection.py +174 -0
  145. sqlalchemy/log.py +288 -0
  146. sqlalchemy/orm/__init__.py +170 -0
  147. sqlalchemy/orm/_orm_constructors.py +2571 -0
  148. sqlalchemy/orm/_typing.py +179 -0
  149. sqlalchemy/orm/attributes.py +2835 -0
  150. sqlalchemy/orm/base.py +973 -0
  151. sqlalchemy/orm/bulk_persistence.py +2123 -0
  152. sqlalchemy/orm/clsregistry.py +571 -0
  153. sqlalchemy/orm/collections.py +1620 -0
  154. sqlalchemy/orm/context.py +3268 -0
  155. sqlalchemy/orm/decl_api.py +1883 -0
  156. sqlalchemy/orm/decl_base.py +2190 -0
  157. sqlalchemy/orm/dependency.py +1304 -0
  158. sqlalchemy/orm/descriptor_props.py +1076 -0
  159. sqlalchemy/orm/dynamic.py +300 -0
  160. sqlalchemy/orm/evaluator.py +379 -0
  161. sqlalchemy/orm/events.py +3261 -0
  162. sqlalchemy/orm/exc.py +228 -0
  163. sqlalchemy/orm/identity.py +302 -0
  164. sqlalchemy/orm/instrumentation.py +754 -0
  165. sqlalchemy/orm/interfaces.py +1474 -0
  166. sqlalchemy/orm/loading.py +1682 -0
  167. sqlalchemy/orm/mapped_collection.py +557 -0
  168. sqlalchemy/orm/mapper.py +4432 -0
  169. sqlalchemy/orm/path_registry.py +811 -0
  170. sqlalchemy/orm/persistence.py +1782 -0
  171. sqlalchemy/orm/properties.py +886 -0
  172. sqlalchemy/orm/query.py +3396 -0
  173. sqlalchemy/orm/relationships.py +3500 -0
  174. sqlalchemy/orm/scoping.py +2165 -0
  175. sqlalchemy/orm/session.py +5301 -0
  176. sqlalchemy/orm/state.py +1143 -0
  177. sqlalchemy/orm/state_changes.py +198 -0
  178. sqlalchemy/orm/strategies.py +3473 -0
  179. sqlalchemy/orm/strategy_options.py +2569 -0
  180. sqlalchemy/orm/sync.py +164 -0
  181. sqlalchemy/orm/unitofwork.py +796 -0
  182. sqlalchemy/orm/util.py +2424 -0
  183. sqlalchemy/orm/writeonly.py +678 -0
  184. sqlalchemy/pool/__init__.py +44 -0
  185. sqlalchemy/pool/base.py +1515 -0
  186. sqlalchemy/pool/events.py +370 -0
  187. sqlalchemy/pool/impl.py +581 -0
  188. sqlalchemy/py.typed +0 -0
  189. sqlalchemy/schema.py +70 -0
  190. sqlalchemy/sql/__init__.py +145 -0
  191. sqlalchemy/sql/_dml_constructors.py +140 -0
  192. sqlalchemy/sql/_elements_constructors.py +1850 -0
  193. sqlalchemy/sql/_orm_types.py +20 -0
  194. sqlalchemy/sql/_py_util.py +75 -0
  195. sqlalchemy/sql/_selectable_constructors.py +635 -0
  196. sqlalchemy/sql/_typing.py +460 -0
  197. sqlalchemy/sql/annotation.py +585 -0
  198. sqlalchemy/sql/base.py +2185 -0
  199. sqlalchemy/sql/cache_key.py +1057 -0
  200. sqlalchemy/sql/coercions.py +1405 -0
  201. sqlalchemy/sql/compiler.py +7818 -0
  202. sqlalchemy/sql/crud.py +1669 -0
  203. sqlalchemy/sql/ddl.py +1378 -0
  204. sqlalchemy/sql/default_comparator.py +552 -0
  205. sqlalchemy/sql/dml.py +1817 -0
  206. sqlalchemy/sql/elements.py +5499 -0
  207. sqlalchemy/sql/events.py +455 -0
  208. sqlalchemy/sql/expression.py +162 -0
  209. sqlalchemy/sql/functions.py +2055 -0
  210. sqlalchemy/sql/lambdas.py +1449 -0
  211. sqlalchemy/sql/naming.py +212 -0
  212. sqlalchemy/sql/operators.py +2579 -0
  213. sqlalchemy/sql/roles.py +323 -0
  214. sqlalchemy/sql/schema.py +6158 -0
  215. sqlalchemy/sql/selectable.py +7004 -0
  216. sqlalchemy/sql/sqltypes.py +3827 -0
  217. sqlalchemy/sql/traversals.py +1024 -0
  218. sqlalchemy/sql/type_api.py +2339 -0
  219. sqlalchemy/sql/util.py +1486 -0
  220. sqlalchemy/sql/visitors.py +1165 -0
  221. sqlalchemy/testing/__init__.py +96 -0
  222. sqlalchemy/testing/assertions.py +989 -0
  223. sqlalchemy/testing/assertsql.py +516 -0
  224. sqlalchemy/testing/asyncio.py +135 -0
  225. sqlalchemy/testing/config.py +427 -0
  226. sqlalchemy/testing/engines.py +472 -0
  227. sqlalchemy/testing/entities.py +117 -0
  228. sqlalchemy/testing/exclusions.py +435 -0
  229. sqlalchemy/testing/fixtures/__init__.py +28 -0
  230. sqlalchemy/testing/fixtures/base.py +366 -0
  231. sqlalchemy/testing/fixtures/mypy.py +312 -0
  232. sqlalchemy/testing/fixtures/orm.py +227 -0
  233. sqlalchemy/testing/fixtures/sql.py +503 -0
  234. sqlalchemy/testing/pickleable.py +155 -0
  235. sqlalchemy/testing/plugin/__init__.py +6 -0
  236. sqlalchemy/testing/plugin/bootstrap.py +51 -0
  237. sqlalchemy/testing/plugin/plugin_base.py +779 -0
  238. sqlalchemy/testing/plugin/pytestplugin.py +868 -0
  239. sqlalchemy/testing/profiling.py +324 -0
  240. sqlalchemy/testing/provision.py +496 -0
  241. sqlalchemy/testing/requirements.py +1818 -0
  242. sqlalchemy/testing/schema.py +224 -0
  243. sqlalchemy/testing/suite/__init__.py +19 -0
  244. sqlalchemy/testing/suite/test_cte.py +211 -0
  245. sqlalchemy/testing/suite/test_ddl.py +389 -0
  246. sqlalchemy/testing/suite/test_deprecations.py +153 -0
  247. sqlalchemy/testing/suite/test_dialect.py +740 -0
  248. sqlalchemy/testing/suite/test_insert.py +630 -0
  249. sqlalchemy/testing/suite/test_reflection.py +3225 -0
  250. sqlalchemy/testing/suite/test_results.py +502 -0
  251. sqlalchemy/testing/suite/test_rowcount.py +258 -0
  252. sqlalchemy/testing/suite/test_select.py +1999 -0
  253. sqlalchemy/testing/suite/test_sequence.py +317 -0
  254. sqlalchemy/testing/suite/test_types.py +2141 -0
  255. sqlalchemy/testing/suite/test_unicode_ddl.py +189 -0
  256. sqlalchemy/testing/suite/test_update_delete.py +139 -0
  257. sqlalchemy/testing/util.py +537 -0
  258. sqlalchemy/testing/warnings.py +52 -0
  259. sqlalchemy/types.py +76 -0
  260. sqlalchemy/util/__init__.py +160 -0
  261. sqlalchemy/util/_collections.py +715 -0
  262. sqlalchemy/util/_concurrency_py3k.py +288 -0
  263. sqlalchemy/util/_has_cy.py +40 -0
  264. sqlalchemy/util/_py_collections.py +541 -0
  265. sqlalchemy/util/compat.py +301 -0
  266. sqlalchemy/util/concurrency.py +108 -0
  267. sqlalchemy/util/deprecations.py +401 -0
  268. sqlalchemy/util/langhelpers.py +2218 -0
  269. sqlalchemy/util/preloaded.py +150 -0
  270. sqlalchemy/util/queue.py +322 -0
  271. sqlalchemy/util/tool_support.py +201 -0
  272. sqlalchemy/util/topological.py +120 -0
  273. sqlalchemy/util/typing.py +629 -0
@@ -0,0 +1,460 @@
1
+ # sql/_typing.py
2
+ # Copyright (C) 2022-2024 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
+
8
+ from __future__ import annotations
9
+
10
+ import operator
11
+ from typing import Any
12
+ from typing import Callable
13
+ from typing import Dict
14
+ from typing import Generic
15
+ from typing import Iterable
16
+ from typing import Mapping
17
+ from typing import NoReturn
18
+ from typing import Optional
19
+ from typing import overload
20
+ from typing import Set
21
+ from typing import Tuple
22
+ from typing import Type
23
+ from typing import TYPE_CHECKING
24
+ from typing import TypeVar
25
+ from typing import Union
26
+
27
+ from . import roles
28
+ from .. import exc
29
+ from .. import util
30
+ from ..inspection import Inspectable
31
+ from ..util.typing import Literal
32
+ from ..util.typing import Protocol
33
+ from ..util.typing import TypeAlias
34
+
35
+ if TYPE_CHECKING:
36
+ from datetime import date
37
+ from datetime import datetime
38
+ from datetime import time
39
+ from datetime import timedelta
40
+ from decimal import Decimal
41
+ from uuid import UUID
42
+
43
+ from .base import Executable
44
+ from .compiler import Compiled
45
+ from .compiler import DDLCompiler
46
+ from .compiler import SQLCompiler
47
+ from .dml import UpdateBase
48
+ from .dml import ValuesBase
49
+ from .elements import ClauseElement
50
+ from .elements import ColumnElement
51
+ from .elements import KeyedColumnElement
52
+ from .elements import quoted_name
53
+ from .elements import SQLCoreOperations
54
+ from .elements import TextClause
55
+ from .lambdas import LambdaElement
56
+ from .roles import FromClauseRole
57
+ from .schema import Column
58
+ from .selectable import Alias
59
+ from .selectable import CTE
60
+ from .selectable import FromClause
61
+ from .selectable import Join
62
+ from .selectable import NamedFromClause
63
+ from .selectable import ReturnsRows
64
+ from .selectable import Select
65
+ from .selectable import Selectable
66
+ from .selectable import SelectBase
67
+ from .selectable import Subquery
68
+ from .selectable import TableClause
69
+ from .sqltypes import TableValueType
70
+ from .sqltypes import TupleType
71
+ from .type_api import TypeEngine
72
+ from ..engine import Dialect
73
+ from ..util.typing import TypeGuard
74
+
75
+ _T = TypeVar("_T", bound=Any)
76
+ _T_co = TypeVar("_T_co", bound=Any, covariant=True)
77
+
78
+
79
+ _CE = TypeVar("_CE", bound="ColumnElement[Any]")
80
+
81
+ _CLE = TypeVar("_CLE", bound="ClauseElement")
82
+
83
+
84
+ class _HasClauseElement(Protocol, Generic[_T_co]):
85
+ """indicates a class that has a __clause_element__() method"""
86
+
87
+ def __clause_element__(self) -> roles.ExpressionElementRole[_T_co]: ...
88
+
89
+
90
+ class _CoreAdapterProto(Protocol):
91
+ """protocol for the ClauseAdapter/ColumnAdapter.traverse() method."""
92
+
93
+ def __call__(self, obj: _CE) -> _CE: ...
94
+
95
+
96
+ class _HasDialect(Protocol):
97
+ """protocol for Engine/Connection-like objects that have dialect
98
+ attribute.
99
+ """
100
+
101
+ @property
102
+ def dialect(self) -> Dialect: ...
103
+
104
+
105
+ # match column types that are not ORM entities
106
+ _NOT_ENTITY = TypeVar(
107
+ "_NOT_ENTITY",
108
+ int,
109
+ str,
110
+ bool,
111
+ "datetime",
112
+ "date",
113
+ "time",
114
+ "timedelta",
115
+ "UUID",
116
+ float,
117
+ "Decimal",
118
+ )
119
+
120
+ _StarOrOne = Literal["*", 1]
121
+
122
+ _MAYBE_ENTITY = TypeVar(
123
+ "_MAYBE_ENTITY",
124
+ roles.ColumnsClauseRole,
125
+ _StarOrOne,
126
+ Type[Any],
127
+ Inspectable[_HasClauseElement[Any]],
128
+ _HasClauseElement[Any],
129
+ )
130
+
131
+
132
+ # convention:
133
+ # XYZArgument - something that the end user is passing to a public API method
134
+ # XYZElement - the internal representation that we use for the thing.
135
+ # the coercions system is responsible for converting from XYZArgument to
136
+ # XYZElement.
137
+
138
+ _TextCoercedExpressionArgument = Union[
139
+ str,
140
+ "TextClause",
141
+ "ColumnElement[_T]",
142
+ _HasClauseElement[_T],
143
+ roles.ExpressionElementRole[_T],
144
+ ]
145
+
146
+ _ColumnsClauseArgument = Union[
147
+ roles.TypedColumnsClauseRole[_T],
148
+ roles.ColumnsClauseRole,
149
+ "SQLCoreOperations[_T]",
150
+ _StarOrOne,
151
+ Type[_T],
152
+ Inspectable[_HasClauseElement[_T]],
153
+ _HasClauseElement[_T],
154
+ ]
155
+ """open-ended SELECT columns clause argument.
156
+
157
+ Includes column expressions, tables, ORM mapped entities, a few literal values.
158
+
159
+ This type is used for lists of columns / entities to be returned in result
160
+ sets; select(...), insert().returning(...), etc.
161
+
162
+
163
+ """
164
+
165
+ _TypedColumnClauseArgument = Union[
166
+ roles.TypedColumnsClauseRole[_T],
167
+ "SQLCoreOperations[_T]",
168
+ Type[_T],
169
+ ]
170
+
171
+ _TP = TypeVar("_TP", bound=Tuple[Any, ...])
172
+
173
+ _T0 = TypeVar("_T0", bound=Any)
174
+ _T1 = TypeVar("_T1", bound=Any)
175
+ _T2 = TypeVar("_T2", bound=Any)
176
+ _T3 = TypeVar("_T3", bound=Any)
177
+ _T4 = TypeVar("_T4", bound=Any)
178
+ _T5 = TypeVar("_T5", bound=Any)
179
+ _T6 = TypeVar("_T6", bound=Any)
180
+ _T7 = TypeVar("_T7", bound=Any)
181
+ _T8 = TypeVar("_T8", bound=Any)
182
+ _T9 = TypeVar("_T9", bound=Any)
183
+
184
+
185
+ _ColumnExpressionArgument = Union[
186
+ "ColumnElement[_T]",
187
+ _HasClauseElement[_T],
188
+ "SQLCoreOperations[_T]",
189
+ roles.ExpressionElementRole[_T],
190
+ roles.TypedColumnsClauseRole[_T],
191
+ Callable[[], "ColumnElement[_T]"],
192
+ "LambdaElement",
193
+ ]
194
+ "See docs in public alias ColumnExpressionArgument."
195
+
196
+ ColumnExpressionArgument: TypeAlias = _ColumnExpressionArgument[_T]
197
+ """Narrower "column expression" argument.
198
+
199
+ This type is used for all the other "column" kinds of expressions that
200
+ typically represent a single SQL column expression, not a set of columns the
201
+ way a table or ORM entity does.
202
+
203
+ This includes ColumnElement, or ORM-mapped attributes that will have a
204
+ ``__clause_element__()`` method, it also has the ExpressionElementRole
205
+ overall which brings in the TextClause object also.
206
+
207
+ .. versionadded:: 2.0.13
208
+
209
+ """
210
+
211
+ _ColumnExpressionOrLiteralArgument = Union[Any, _ColumnExpressionArgument[_T]]
212
+
213
+ _ColumnExpressionOrStrLabelArgument = Union[str, _ColumnExpressionArgument[_T]]
214
+
215
+ _ByArgument = Union[
216
+ Iterable[_ColumnExpressionOrStrLabelArgument[Any]],
217
+ _ColumnExpressionOrStrLabelArgument[Any],
218
+ ]
219
+ """Used for keyword-based ``order_by`` and ``partition_by`` parameters."""
220
+
221
+
222
+ _InfoType = Dict[Any, Any]
223
+ """the .info dictionary accepted and used throughout Core /ORM"""
224
+
225
+ _FromClauseArgument = Union[
226
+ roles.FromClauseRole,
227
+ Type[Any],
228
+ Inspectable[_HasClauseElement[Any]],
229
+ _HasClauseElement[Any],
230
+ ]
231
+ """A FROM clause, like we would send to select().select_from().
232
+
233
+ Also accommodates ORM entities and related constructs.
234
+
235
+ """
236
+
237
+ _JoinTargetArgument = Union[_FromClauseArgument, roles.JoinTargetRole]
238
+ """target for join() builds on _FromClauseArgument to include additional
239
+ join target roles such as those which come from the ORM.
240
+
241
+ """
242
+
243
+ _OnClauseArgument = Union[_ColumnExpressionArgument[Any], roles.OnClauseRole]
244
+ """target for an ON clause, includes additional roles such as those which
245
+ come from the ORM.
246
+
247
+ """
248
+
249
+ _SelectStatementForCompoundArgument = Union[
250
+ "SelectBase", roles.CompoundElementRole
251
+ ]
252
+ """SELECT statement acceptable by ``union()`` and other SQL set operations"""
253
+
254
+ _DMLColumnArgument = Union[
255
+ str,
256
+ _HasClauseElement[Any],
257
+ roles.DMLColumnRole,
258
+ "SQLCoreOperations[Any]",
259
+ ]
260
+ """A DML column expression. This is a "key" inside of insert().values(),
261
+ update().values(), and related.
262
+
263
+ These are usually strings or SQL table columns.
264
+
265
+ There's also edge cases like JSON expression assignment, which we would want
266
+ the DMLColumnRole to be able to accommodate.
267
+
268
+ """
269
+
270
+ _DMLKey = TypeVar("_DMLKey", bound=_DMLColumnArgument)
271
+ _DMLColumnKeyMapping = Mapping[_DMLKey, Any]
272
+
273
+
274
+ _DDLColumnArgument = Union[str, "Column[Any]", roles.DDLConstraintColumnRole]
275
+ """DDL column.
276
+
277
+ used for :class:`.PrimaryKeyConstraint`, :class:`.UniqueConstraint`, etc.
278
+
279
+ """
280
+
281
+ _DMLTableArgument = Union[
282
+ "TableClause",
283
+ "Join",
284
+ "Alias",
285
+ "CTE",
286
+ Type[Any],
287
+ Inspectable[_HasClauseElement[Any]],
288
+ _HasClauseElement[Any],
289
+ ]
290
+
291
+ _PropagateAttrsType = util.immutabledict[str, Any]
292
+
293
+ _TypeEngineArgument = Union[Type["TypeEngine[_T]"], "TypeEngine[_T]"]
294
+
295
+ _EquivalentColumnMap = Dict["ColumnElement[Any]", Set["ColumnElement[Any]"]]
296
+
297
+ _LimitOffsetType = Union[int, _ColumnExpressionArgument[int], None]
298
+
299
+ _AutoIncrementType = Union[bool, Literal["auto", "ignore_fk"]]
300
+
301
+ if TYPE_CHECKING:
302
+
303
+ def is_sql_compiler(c: Compiled) -> TypeGuard[SQLCompiler]: ...
304
+
305
+ def is_ddl_compiler(c: Compiled) -> TypeGuard[DDLCompiler]: ...
306
+
307
+ def is_named_from_clause(
308
+ t: FromClauseRole,
309
+ ) -> TypeGuard[NamedFromClause]: ...
310
+
311
+ def is_column_element(
312
+ c: ClauseElement,
313
+ ) -> TypeGuard[ColumnElement[Any]]: ...
314
+
315
+ def is_keyed_column_element(
316
+ c: ClauseElement,
317
+ ) -> TypeGuard[KeyedColumnElement[Any]]: ...
318
+
319
+ def is_text_clause(c: ClauseElement) -> TypeGuard[TextClause]: ...
320
+
321
+ def is_from_clause(c: ClauseElement) -> TypeGuard[FromClause]: ...
322
+
323
+ def is_tuple_type(t: TypeEngine[Any]) -> TypeGuard[TupleType]: ...
324
+
325
+ def is_table_value_type(
326
+ t: TypeEngine[Any],
327
+ ) -> TypeGuard[TableValueType]: ...
328
+
329
+ def is_selectable(t: Any) -> TypeGuard[Selectable]: ...
330
+
331
+ def is_select_base(
332
+ t: Union[Executable, ReturnsRows]
333
+ ) -> TypeGuard[SelectBase]: ...
334
+
335
+ def is_select_statement(
336
+ t: Union[Executable, ReturnsRows]
337
+ ) -> TypeGuard[Select[Any]]: ...
338
+
339
+ def is_table(t: FromClause) -> TypeGuard[TableClause]: ...
340
+
341
+ def is_subquery(t: FromClause) -> TypeGuard[Subquery]: ...
342
+
343
+ def is_dml(c: ClauseElement) -> TypeGuard[UpdateBase]: ...
344
+
345
+ else:
346
+ is_sql_compiler = operator.attrgetter("is_sql")
347
+ is_ddl_compiler = operator.attrgetter("is_ddl")
348
+ is_named_from_clause = operator.attrgetter("named_with_column")
349
+ is_column_element = operator.attrgetter("_is_column_element")
350
+ is_keyed_column_element = operator.attrgetter("_is_keyed_column_element")
351
+ is_text_clause = operator.attrgetter("_is_text_clause")
352
+ is_from_clause = operator.attrgetter("_is_from_clause")
353
+ is_tuple_type = operator.attrgetter("_is_tuple_type")
354
+ is_table_value_type = operator.attrgetter("_is_table_value")
355
+ is_selectable = operator.attrgetter("is_selectable")
356
+ is_select_base = operator.attrgetter("_is_select_base")
357
+ is_select_statement = operator.attrgetter("_is_select_statement")
358
+ is_table = operator.attrgetter("_is_table")
359
+ is_subquery = operator.attrgetter("_is_subquery")
360
+ is_dml = operator.attrgetter("is_dml")
361
+
362
+
363
+ def has_schema_attr(t: FromClauseRole) -> TypeGuard[TableClause]:
364
+ return hasattr(t, "schema")
365
+
366
+
367
+ def is_quoted_name(s: str) -> TypeGuard[quoted_name]:
368
+ return hasattr(s, "quote")
369
+
370
+
371
+ def is_has_clause_element(s: object) -> TypeGuard[_HasClauseElement[Any]]:
372
+ return hasattr(s, "__clause_element__")
373
+
374
+
375
+ def is_insert_update(c: ClauseElement) -> TypeGuard[ValuesBase]:
376
+ return c.is_dml and (c.is_insert or c.is_update) # type: ignore
377
+
378
+
379
+ def _no_kw() -> exc.ArgumentError:
380
+ return exc.ArgumentError(
381
+ "Additional keyword arguments are not accepted by this "
382
+ "function/method. The presence of **kw is for pep-484 typing purposes"
383
+ )
384
+
385
+
386
+ def _unexpected_kw(methname: str, kw: Dict[str, Any]) -> NoReturn:
387
+ k = list(kw)[0]
388
+ raise TypeError(f"{methname} got an unexpected keyword argument '{k}'")
389
+
390
+
391
+ @overload
392
+ def Nullable(
393
+ val: "SQLCoreOperations[_T]",
394
+ ) -> "SQLCoreOperations[Optional[_T]]": ...
395
+
396
+
397
+ @overload
398
+ def Nullable(
399
+ val: roles.ExpressionElementRole[_T],
400
+ ) -> roles.ExpressionElementRole[Optional[_T]]: ...
401
+
402
+
403
+ @overload
404
+ def Nullable(val: Type[_T]) -> Type[Optional[_T]]: ...
405
+
406
+
407
+ def Nullable(
408
+ val: _TypedColumnClauseArgument[_T],
409
+ ) -> _TypedColumnClauseArgument[Optional[_T]]:
410
+ """Types a column or ORM class as nullable.
411
+
412
+ This can be used in select and other contexts to express that the value of
413
+ a column can be null, for example due to an outer join::
414
+
415
+ stmt1 = select(A, Nullable(B)).outerjoin(A.bs)
416
+ stmt2 = select(A.data, Nullable(B.data)).outerjoin(A.bs)
417
+
418
+ At runtime this method returns the input unchanged.
419
+
420
+ .. versionadded:: 2.0.20
421
+ """
422
+ return val
423
+
424
+
425
+ @overload
426
+ def NotNullable(
427
+ val: "SQLCoreOperations[Optional[_T]]",
428
+ ) -> "SQLCoreOperations[_T]": ...
429
+
430
+
431
+ @overload
432
+ def NotNullable(
433
+ val: roles.ExpressionElementRole[Optional[_T]],
434
+ ) -> roles.ExpressionElementRole[_T]: ...
435
+
436
+
437
+ @overload
438
+ def NotNullable(val: Type[Optional[_T]]) -> Type[_T]: ...
439
+
440
+
441
+ @overload
442
+ def NotNullable(val: Optional[Type[_T]]) -> Type[_T]: ...
443
+
444
+
445
+ def NotNullable(
446
+ val: Union[_TypedColumnClauseArgument[Optional[_T]], Optional[Type[_T]]],
447
+ ) -> _TypedColumnClauseArgument[_T]:
448
+ """Types a column or ORM class as not nullable.
449
+
450
+ This can be used in select and other contexts to express that the value of
451
+ a column cannot be null, for example due to a where condition on a
452
+ nullable column::
453
+
454
+ stmt = select(NotNullable(A.value)).where(A.value.is_not(None))
455
+
456
+ At runtime this method returns the input unchanged.
457
+
458
+ .. versionadded:: 2.0.20
459
+ """
460
+ return val # type: ignore