SQLAlchemy 2.1.0b2__cp313-cp313t-win_arm64.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 (270) hide show
  1. sqlalchemy/__init__.py +298 -0
  2. sqlalchemy/connectors/__init__.py +18 -0
  3. sqlalchemy/connectors/aioodbc.py +171 -0
  4. sqlalchemy/connectors/asyncio.py +476 -0
  5. sqlalchemy/connectors/pyodbc.py +250 -0
  6. sqlalchemy/dialects/__init__.py +62 -0
  7. sqlalchemy/dialects/_typing.py +30 -0
  8. sqlalchemy/dialects/mssql/__init__.py +89 -0
  9. sqlalchemy/dialects/mssql/aioodbc.py +63 -0
  10. sqlalchemy/dialects/mssql/base.py +4166 -0
  11. sqlalchemy/dialects/mssql/information_schema.py +285 -0
  12. sqlalchemy/dialects/mssql/json.py +140 -0
  13. sqlalchemy/dialects/mssql/mssqlpython.py +220 -0
  14. sqlalchemy/dialects/mssql/provision.py +196 -0
  15. sqlalchemy/dialects/mssql/pymssql.py +126 -0
  16. sqlalchemy/dialects/mssql/pyodbc.py +698 -0
  17. sqlalchemy/dialects/mysql/__init__.py +106 -0
  18. sqlalchemy/dialects/mysql/_mariadb_shim.py +312 -0
  19. sqlalchemy/dialects/mysql/aiomysql.py +226 -0
  20. sqlalchemy/dialects/mysql/asyncmy.py +214 -0
  21. sqlalchemy/dialects/mysql/base.py +3877 -0
  22. sqlalchemy/dialects/mysql/cymysql.py +106 -0
  23. sqlalchemy/dialects/mysql/dml.py +279 -0
  24. sqlalchemy/dialects/mysql/enumerated.py +277 -0
  25. sqlalchemy/dialects/mysql/expression.py +146 -0
  26. sqlalchemy/dialects/mysql/json.py +92 -0
  27. sqlalchemy/dialects/mysql/mariadb.py +67 -0
  28. sqlalchemy/dialects/mysql/mariadbconnector.py +330 -0
  29. sqlalchemy/dialects/mysql/mysqlconnector.py +296 -0
  30. sqlalchemy/dialects/mysql/mysqldb.py +312 -0
  31. sqlalchemy/dialects/mysql/provision.py +153 -0
  32. sqlalchemy/dialects/mysql/pymysql.py +157 -0
  33. sqlalchemy/dialects/mysql/pyodbc.py +156 -0
  34. sqlalchemy/dialects/mysql/reflection.py +724 -0
  35. sqlalchemy/dialects/mysql/reserved_words.py +570 -0
  36. sqlalchemy/dialects/mysql/types.py +845 -0
  37. sqlalchemy/dialects/oracle/__init__.py +85 -0
  38. sqlalchemy/dialects/oracle/base.py +3977 -0
  39. sqlalchemy/dialects/oracle/cx_oracle.py +1601 -0
  40. sqlalchemy/dialects/oracle/dictionary.py +507 -0
  41. sqlalchemy/dialects/oracle/json.py +158 -0
  42. sqlalchemy/dialects/oracle/oracledb.py +909 -0
  43. sqlalchemy/dialects/oracle/provision.py +288 -0
  44. sqlalchemy/dialects/oracle/types.py +367 -0
  45. sqlalchemy/dialects/oracle/vector.py +368 -0
  46. sqlalchemy/dialects/postgresql/__init__.py +171 -0
  47. sqlalchemy/dialects/postgresql/_psycopg_common.py +229 -0
  48. sqlalchemy/dialects/postgresql/array.py +534 -0
  49. sqlalchemy/dialects/postgresql/asyncpg.py +1323 -0
  50. sqlalchemy/dialects/postgresql/base.py +5789 -0
  51. sqlalchemy/dialects/postgresql/bitstring.py +327 -0
  52. sqlalchemy/dialects/postgresql/dml.py +360 -0
  53. sqlalchemy/dialects/postgresql/ext.py +593 -0
  54. sqlalchemy/dialects/postgresql/hstore.py +423 -0
  55. sqlalchemy/dialects/postgresql/json.py +408 -0
  56. sqlalchemy/dialects/postgresql/named_types.py +521 -0
  57. sqlalchemy/dialects/postgresql/operators.py +130 -0
  58. sqlalchemy/dialects/postgresql/pg8000.py +670 -0
  59. sqlalchemy/dialects/postgresql/pg_catalog.py +344 -0
  60. sqlalchemy/dialects/postgresql/provision.py +184 -0
  61. sqlalchemy/dialects/postgresql/psycopg.py +799 -0
  62. sqlalchemy/dialects/postgresql/psycopg2.py +860 -0
  63. sqlalchemy/dialects/postgresql/psycopg2cffi.py +61 -0
  64. sqlalchemy/dialects/postgresql/ranges.py +1002 -0
  65. sqlalchemy/dialects/postgresql/types.py +388 -0
  66. sqlalchemy/dialects/sqlite/__init__.py +57 -0
  67. sqlalchemy/dialects/sqlite/aiosqlite.py +321 -0
  68. sqlalchemy/dialects/sqlite/base.py +3063 -0
  69. sqlalchemy/dialects/sqlite/dml.py +279 -0
  70. sqlalchemy/dialects/sqlite/json.py +100 -0
  71. sqlalchemy/dialects/sqlite/provision.py +229 -0
  72. sqlalchemy/dialects/sqlite/pysqlcipher.py +161 -0
  73. sqlalchemy/dialects/sqlite/pysqlite.py +754 -0
  74. sqlalchemy/dialects/type_migration_guidelines.txt +145 -0
  75. sqlalchemy/engine/__init__.py +62 -0
  76. sqlalchemy/engine/_processors_cy.cp313t-win_arm64.pyd +0 -0
  77. sqlalchemy/engine/_processors_cy.py +92 -0
  78. sqlalchemy/engine/_result_cy.cp313t-win_arm64.pyd +0 -0
  79. sqlalchemy/engine/_result_cy.py +633 -0
  80. sqlalchemy/engine/_row_cy.cp313t-win_arm64.pyd +0 -0
  81. sqlalchemy/engine/_row_cy.py +232 -0
  82. sqlalchemy/engine/_util_cy.cp313t-win_arm64.pyd +0 -0
  83. sqlalchemy/engine/_util_cy.py +136 -0
  84. sqlalchemy/engine/base.py +3354 -0
  85. sqlalchemy/engine/characteristics.py +155 -0
  86. sqlalchemy/engine/create.py +877 -0
  87. sqlalchemy/engine/cursor.py +2421 -0
  88. sqlalchemy/engine/default.py +2402 -0
  89. sqlalchemy/engine/events.py +965 -0
  90. sqlalchemy/engine/interfaces.py +3495 -0
  91. sqlalchemy/engine/mock.py +134 -0
  92. sqlalchemy/engine/processors.py +82 -0
  93. sqlalchemy/engine/reflection.py +2100 -0
  94. sqlalchemy/engine/result.py +1966 -0
  95. sqlalchemy/engine/row.py +397 -0
  96. sqlalchemy/engine/strategies.py +16 -0
  97. sqlalchemy/engine/url.py +922 -0
  98. sqlalchemy/engine/util.py +156 -0
  99. sqlalchemy/event/__init__.py +26 -0
  100. sqlalchemy/event/api.py +220 -0
  101. sqlalchemy/event/attr.py +674 -0
  102. sqlalchemy/event/base.py +472 -0
  103. sqlalchemy/event/legacy.py +258 -0
  104. sqlalchemy/event/registry.py +390 -0
  105. sqlalchemy/events.py +17 -0
  106. sqlalchemy/exc.py +922 -0
  107. sqlalchemy/ext/__init__.py +11 -0
  108. sqlalchemy/ext/associationproxy.py +2072 -0
  109. sqlalchemy/ext/asyncio/__init__.py +29 -0
  110. sqlalchemy/ext/asyncio/base.py +281 -0
  111. sqlalchemy/ext/asyncio/engine.py +1487 -0
  112. sqlalchemy/ext/asyncio/exc.py +21 -0
  113. sqlalchemy/ext/asyncio/result.py +994 -0
  114. sqlalchemy/ext/asyncio/scoping.py +1679 -0
  115. sqlalchemy/ext/asyncio/session.py +2007 -0
  116. sqlalchemy/ext/automap.py +1701 -0
  117. sqlalchemy/ext/baked.py +559 -0
  118. sqlalchemy/ext/compiler.py +600 -0
  119. sqlalchemy/ext/declarative/__init__.py +65 -0
  120. sqlalchemy/ext/declarative/extensions.py +560 -0
  121. sqlalchemy/ext/horizontal_shard.py +481 -0
  122. sqlalchemy/ext/hybrid.py +1877 -0
  123. sqlalchemy/ext/indexable.py +364 -0
  124. sqlalchemy/ext/instrumentation.py +450 -0
  125. sqlalchemy/ext/mutable.py +1081 -0
  126. sqlalchemy/ext/orderinglist.py +439 -0
  127. sqlalchemy/ext/serializer.py +185 -0
  128. sqlalchemy/future/__init__.py +16 -0
  129. sqlalchemy/future/engine.py +15 -0
  130. sqlalchemy/inspection.py +174 -0
  131. sqlalchemy/log.py +283 -0
  132. sqlalchemy/orm/__init__.py +176 -0
  133. sqlalchemy/orm/_orm_constructors.py +2694 -0
  134. sqlalchemy/orm/_typing.py +179 -0
  135. sqlalchemy/orm/attributes.py +2868 -0
  136. sqlalchemy/orm/base.py +976 -0
  137. sqlalchemy/orm/bulk_persistence.py +2152 -0
  138. sqlalchemy/orm/clsregistry.py +582 -0
  139. sqlalchemy/orm/collections.py +1568 -0
  140. sqlalchemy/orm/context.py +3471 -0
  141. sqlalchemy/orm/decl_api.py +2280 -0
  142. sqlalchemy/orm/decl_base.py +2309 -0
  143. sqlalchemy/orm/dependency.py +1306 -0
  144. sqlalchemy/orm/descriptor_props.py +1183 -0
  145. sqlalchemy/orm/dynamic.py +307 -0
  146. sqlalchemy/orm/evaluator.py +379 -0
  147. sqlalchemy/orm/events.py +3386 -0
  148. sqlalchemy/orm/exc.py +237 -0
  149. sqlalchemy/orm/identity.py +302 -0
  150. sqlalchemy/orm/instrumentation.py +746 -0
  151. sqlalchemy/orm/interfaces.py +1589 -0
  152. sqlalchemy/orm/loading.py +1684 -0
  153. sqlalchemy/orm/mapped_collection.py +557 -0
  154. sqlalchemy/orm/mapper.py +4411 -0
  155. sqlalchemy/orm/path_registry.py +829 -0
  156. sqlalchemy/orm/persistence.py +1789 -0
  157. sqlalchemy/orm/properties.py +973 -0
  158. sqlalchemy/orm/query.py +3528 -0
  159. sqlalchemy/orm/relationships.py +3570 -0
  160. sqlalchemy/orm/scoping.py +2232 -0
  161. sqlalchemy/orm/session.py +5403 -0
  162. sqlalchemy/orm/state.py +1175 -0
  163. sqlalchemy/orm/state_changes.py +196 -0
  164. sqlalchemy/orm/strategies.py +3492 -0
  165. sqlalchemy/orm/strategy_options.py +2562 -0
  166. sqlalchemy/orm/sync.py +164 -0
  167. sqlalchemy/orm/unitofwork.py +798 -0
  168. sqlalchemy/orm/util.py +2438 -0
  169. sqlalchemy/orm/writeonly.py +694 -0
  170. sqlalchemy/pool/__init__.py +41 -0
  171. sqlalchemy/pool/base.py +1522 -0
  172. sqlalchemy/pool/events.py +375 -0
  173. sqlalchemy/pool/impl.py +582 -0
  174. sqlalchemy/py.typed +0 -0
  175. sqlalchemy/schema.py +74 -0
  176. sqlalchemy/sql/__init__.py +156 -0
  177. sqlalchemy/sql/_annotated_cols.py +397 -0
  178. sqlalchemy/sql/_dml_constructors.py +132 -0
  179. sqlalchemy/sql/_elements_constructors.py +2164 -0
  180. sqlalchemy/sql/_orm_types.py +20 -0
  181. sqlalchemy/sql/_selectable_constructors.py +840 -0
  182. sqlalchemy/sql/_typing.py +487 -0
  183. sqlalchemy/sql/_util_cy.cp313t-win_arm64.pyd +0 -0
  184. sqlalchemy/sql/_util_cy.py +127 -0
  185. sqlalchemy/sql/annotation.py +590 -0
  186. sqlalchemy/sql/base.py +2699 -0
  187. sqlalchemy/sql/cache_key.py +1066 -0
  188. sqlalchemy/sql/coercions.py +1373 -0
  189. sqlalchemy/sql/compiler.py +8327 -0
  190. sqlalchemy/sql/crud.py +1815 -0
  191. sqlalchemy/sql/ddl.py +1928 -0
  192. sqlalchemy/sql/default_comparator.py +654 -0
  193. sqlalchemy/sql/dml.py +1977 -0
  194. sqlalchemy/sql/elements.py +6033 -0
  195. sqlalchemy/sql/events.py +458 -0
  196. sqlalchemy/sql/expression.py +172 -0
  197. sqlalchemy/sql/functions.py +2305 -0
  198. sqlalchemy/sql/lambdas.py +1443 -0
  199. sqlalchemy/sql/naming.py +209 -0
  200. sqlalchemy/sql/operators.py +2897 -0
  201. sqlalchemy/sql/roles.py +332 -0
  202. sqlalchemy/sql/schema.py +6703 -0
  203. sqlalchemy/sql/selectable.py +7553 -0
  204. sqlalchemy/sql/sqltypes.py +4093 -0
  205. sqlalchemy/sql/traversals.py +1042 -0
  206. sqlalchemy/sql/type_api.py +2446 -0
  207. sqlalchemy/sql/util.py +1495 -0
  208. sqlalchemy/sql/visitors.py +1157 -0
  209. sqlalchemy/testing/__init__.py +96 -0
  210. sqlalchemy/testing/assertions.py +1007 -0
  211. sqlalchemy/testing/assertsql.py +519 -0
  212. sqlalchemy/testing/asyncio.py +128 -0
  213. sqlalchemy/testing/config.py +440 -0
  214. sqlalchemy/testing/engines.py +483 -0
  215. sqlalchemy/testing/entities.py +117 -0
  216. sqlalchemy/testing/exclusions.py +476 -0
  217. sqlalchemy/testing/fixtures/__init__.py +30 -0
  218. sqlalchemy/testing/fixtures/base.py +384 -0
  219. sqlalchemy/testing/fixtures/mypy.py +247 -0
  220. sqlalchemy/testing/fixtures/orm.py +227 -0
  221. sqlalchemy/testing/fixtures/sql.py +538 -0
  222. sqlalchemy/testing/pickleable.py +155 -0
  223. sqlalchemy/testing/plugin/__init__.py +6 -0
  224. sqlalchemy/testing/plugin/bootstrap.py +51 -0
  225. sqlalchemy/testing/plugin/plugin_base.py +828 -0
  226. sqlalchemy/testing/plugin/pytestplugin.py +892 -0
  227. sqlalchemy/testing/profiling.py +329 -0
  228. sqlalchemy/testing/provision.py +613 -0
  229. sqlalchemy/testing/requirements.py +1978 -0
  230. sqlalchemy/testing/schema.py +198 -0
  231. sqlalchemy/testing/suite/__init__.py +19 -0
  232. sqlalchemy/testing/suite/test_cte.py +237 -0
  233. sqlalchemy/testing/suite/test_ddl.py +420 -0
  234. sqlalchemy/testing/suite/test_dialect.py +776 -0
  235. sqlalchemy/testing/suite/test_insert.py +630 -0
  236. sqlalchemy/testing/suite/test_reflection.py +3557 -0
  237. sqlalchemy/testing/suite/test_results.py +660 -0
  238. sqlalchemy/testing/suite/test_rowcount.py +258 -0
  239. sqlalchemy/testing/suite/test_select.py +2112 -0
  240. sqlalchemy/testing/suite/test_sequence.py +317 -0
  241. sqlalchemy/testing/suite/test_table_via_select.py +686 -0
  242. sqlalchemy/testing/suite/test_types.py +2271 -0
  243. sqlalchemy/testing/suite/test_unicode_ddl.py +189 -0
  244. sqlalchemy/testing/suite/test_update_delete.py +139 -0
  245. sqlalchemy/testing/util.py +535 -0
  246. sqlalchemy/testing/warnings.py +52 -0
  247. sqlalchemy/types.py +76 -0
  248. sqlalchemy/util/__init__.py +158 -0
  249. sqlalchemy/util/_collections.py +688 -0
  250. sqlalchemy/util/_collections_cy.cp313t-win_arm64.pyd +0 -0
  251. sqlalchemy/util/_collections_cy.pxd +8 -0
  252. sqlalchemy/util/_collections_cy.py +516 -0
  253. sqlalchemy/util/_has_cython.py +46 -0
  254. sqlalchemy/util/_immutabledict_cy.cp313t-win_arm64.pyd +0 -0
  255. sqlalchemy/util/_immutabledict_cy.py +240 -0
  256. sqlalchemy/util/compat.py +299 -0
  257. sqlalchemy/util/concurrency.py +322 -0
  258. sqlalchemy/util/cython.py +79 -0
  259. sqlalchemy/util/deprecations.py +401 -0
  260. sqlalchemy/util/langhelpers.py +2320 -0
  261. sqlalchemy/util/preloaded.py +152 -0
  262. sqlalchemy/util/queue.py +304 -0
  263. sqlalchemy/util/tool_support.py +201 -0
  264. sqlalchemy/util/topological.py +120 -0
  265. sqlalchemy/util/typing.py +711 -0
  266. sqlalchemy-2.1.0b2.dist-info/METADATA +269 -0
  267. sqlalchemy-2.1.0b2.dist-info/RECORD +270 -0
  268. sqlalchemy-2.1.0b2.dist-info/WHEEL +5 -0
  269. sqlalchemy-2.1.0b2.dist-info/licenses/LICENSE +19 -0
  270. sqlalchemy-2.1.0b2.dist-info/top_level.txt +1 -0
@@ -0,0 +1,845 @@
1
+ # dialects/mysql/types.py
2
+ # Copyright (C) 2005-2026 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
+ from __future__ import annotations
8
+
9
+ import datetime
10
+ import decimal
11
+ from typing import Any
12
+ from typing import Iterable
13
+ from typing import Optional
14
+ from typing import TYPE_CHECKING
15
+ from typing import Union
16
+
17
+ from ... import exc
18
+ from ... import util
19
+ from ...sql import sqltypes
20
+
21
+ if TYPE_CHECKING:
22
+ from .base import MySQLDialect
23
+ from ...engine.interfaces import Dialect
24
+ from ...sql.type_api import _BindProcessorType
25
+ from ...sql.type_api import _ResultProcessorType
26
+ from ...sql.type_api import TypeEngine
27
+
28
+
29
+ class _NumericCommonType:
30
+ """Base for MySQL numeric types.
31
+
32
+ This is the base both for NUMERIC as well as INTEGER, hence
33
+ it's a mixin.
34
+
35
+ """
36
+
37
+ def __init__(
38
+ self, unsigned: bool = False, zerofill: bool = False, **kw: Any
39
+ ):
40
+ self.unsigned = unsigned
41
+ self.zerofill = zerofill
42
+ super().__init__(**kw)
43
+
44
+
45
+ class _NumericType(
46
+ _NumericCommonType, sqltypes.Numeric[Union[decimal.Decimal, float]]
47
+ ):
48
+
49
+ def repr_struct(self) -> util.GenericRepr:
50
+ return util.GenericRepr(
51
+ self,
52
+ to_inspect=[_NumericType, _NumericCommonType, sqltypes.Numeric],
53
+ )
54
+
55
+
56
+ class _FloatType(
57
+ _NumericCommonType, sqltypes.Float[Union[decimal.Decimal, float]]
58
+ ):
59
+
60
+ def __init__(
61
+ self,
62
+ precision: Optional[int] = None,
63
+ scale: Optional[int] = None,
64
+ asdecimal: bool = True,
65
+ **kw: Any,
66
+ ):
67
+ if isinstance(self, (REAL, DOUBLE)) and (
68
+ (precision is None and scale is not None)
69
+ or (precision is not None and scale is None)
70
+ ):
71
+ raise exc.ArgumentError(
72
+ "You must specify both precision and scale or omit "
73
+ "both altogether."
74
+ )
75
+ super().__init__(precision=precision, asdecimal=asdecimal, **kw)
76
+ self.scale = scale
77
+
78
+ def repr_struct(self) -> util.GenericRepr:
79
+ return util.GenericRepr(
80
+ self, to_inspect=[_FloatType, _NumericCommonType, sqltypes.Float]
81
+ )
82
+
83
+
84
+ class _IntegerType(_NumericCommonType, sqltypes.Integer):
85
+ def __init__(self, display_width: Optional[int] = None, **kw: Any):
86
+ self.display_width = display_width
87
+ super().__init__(**kw)
88
+
89
+ def repr_struct(self) -> util.GenericRepr:
90
+ return util.GenericRepr(
91
+ self,
92
+ to_inspect=[_IntegerType, _NumericCommonType, sqltypes.Integer],
93
+ )
94
+
95
+
96
+ class _StringType(sqltypes.String):
97
+ """Base for MySQL string types."""
98
+
99
+ def __init__(
100
+ self,
101
+ charset: Optional[str] = None,
102
+ collation: Optional[str] = None,
103
+ ascii: bool = False, # noqa
104
+ binary: bool = False,
105
+ unicode: bool = False,
106
+ national: bool = False,
107
+ **kw: Any,
108
+ ):
109
+ self.charset = charset
110
+
111
+ # allow collate= or collation=
112
+ kw.setdefault("collation", kw.pop("collate", collation))
113
+
114
+ self.ascii = ascii
115
+ self.unicode = unicode
116
+ self.binary = binary
117
+ self.national = national
118
+ super().__init__(**kw)
119
+
120
+ def repr_struct(self) -> util.GenericRepr:
121
+ return util.GenericRepr(
122
+ self, to_inspect=[_StringType, sqltypes.String]
123
+ )
124
+
125
+
126
+ class _MatchType(
127
+ sqltypes.Float[Union[decimal.Decimal, float]], sqltypes.MatchType
128
+ ):
129
+ def __init__(self, **kw: Any):
130
+ # TODO: float arguments?
131
+ sqltypes.Float.__init__(self) # type: ignore[arg-type]
132
+ sqltypes.MatchType.__init__(self)
133
+
134
+
135
+ class NUMERIC(_NumericType, sqltypes.NUMERIC[Union[decimal.Decimal, float]]):
136
+ """MySQL NUMERIC type."""
137
+
138
+ __visit_name__ = "NUMERIC"
139
+
140
+ def __init__(
141
+ self,
142
+ precision: Optional[int] = None,
143
+ scale: Optional[int] = None,
144
+ asdecimal: bool = True,
145
+ **kw: Any,
146
+ ):
147
+ """Construct a NUMERIC.
148
+
149
+ :param precision: Total digits in this number. If scale and precision
150
+ are both None, values are stored to limits allowed by the server.
151
+
152
+ :param scale: The number of digits after the decimal point.
153
+
154
+ :param unsigned: a boolean, optional.
155
+
156
+ :param zerofill: Optional. If true, values will be stored as strings
157
+ left-padded with zeros. Note that this does not effect the values
158
+ returned by the underlying database API, which continue to be
159
+ numeric.
160
+
161
+ """
162
+ super().__init__(
163
+ precision=precision, scale=scale, asdecimal=asdecimal, **kw
164
+ )
165
+
166
+
167
+ class DECIMAL(_NumericType, sqltypes.DECIMAL[Union[decimal.Decimal, float]]):
168
+ """MySQL DECIMAL type."""
169
+
170
+ __visit_name__ = "DECIMAL"
171
+
172
+ def __init__(
173
+ self,
174
+ precision: Optional[int] = None,
175
+ scale: Optional[int] = None,
176
+ asdecimal: bool = True,
177
+ **kw: Any,
178
+ ):
179
+ """Construct a DECIMAL.
180
+
181
+ :param precision: Total digits in this number. If scale and precision
182
+ are both None, values are stored to limits allowed by the server.
183
+
184
+ :param scale: The number of digits after the decimal point.
185
+
186
+ :param unsigned: a boolean, optional.
187
+
188
+ :param zerofill: Optional. If true, values will be stored as strings
189
+ left-padded with zeros. Note that this does not effect the values
190
+ returned by the underlying database API, which continue to be
191
+ numeric.
192
+
193
+ """
194
+ super().__init__(
195
+ precision=precision, scale=scale, asdecimal=asdecimal, **kw
196
+ )
197
+
198
+
199
+ class DOUBLE(_FloatType, sqltypes.DOUBLE[Union[decimal.Decimal, float]]):
200
+ """MySQL DOUBLE type."""
201
+
202
+ __visit_name__ = "DOUBLE"
203
+
204
+ def __init__(
205
+ self,
206
+ precision: Optional[int] = None,
207
+ scale: Optional[int] = None,
208
+ asdecimal: bool = True,
209
+ **kw: Any,
210
+ ):
211
+ """Construct a DOUBLE.
212
+
213
+ .. note::
214
+
215
+ The :class:`.DOUBLE` type by default converts from float
216
+ to Decimal, using a truncation that defaults to 10 digits.
217
+ Specify either ``scale=n`` or ``decimal_return_scale=n`` in order
218
+ to change this scale, or ``asdecimal=False`` to return values
219
+ directly as Python floating points.
220
+
221
+ :param precision: Total digits in this number. If scale and precision
222
+ are both None, values are stored to limits allowed by the server.
223
+
224
+ :param scale: The number of digits after the decimal point.
225
+
226
+ :param unsigned: a boolean, optional.
227
+
228
+ :param zerofill: Optional. If true, values will be stored as strings
229
+ left-padded with zeros. Note that this does not effect the values
230
+ returned by the underlying database API, which continue to be
231
+ numeric.
232
+
233
+ """
234
+ super().__init__(
235
+ precision=precision, scale=scale, asdecimal=asdecimal, **kw
236
+ )
237
+
238
+
239
+ class REAL(_FloatType, sqltypes.REAL[Union[decimal.Decimal, float]]):
240
+ """MySQL REAL type."""
241
+
242
+ __visit_name__ = "REAL"
243
+
244
+ def __init__(
245
+ self,
246
+ precision: Optional[int] = None,
247
+ scale: Optional[int] = None,
248
+ asdecimal: bool = True,
249
+ **kw: Any,
250
+ ):
251
+ """Construct a REAL.
252
+
253
+ .. note::
254
+
255
+ The :class:`.REAL` type by default converts from float
256
+ to Decimal, using a truncation that defaults to 10 digits.
257
+ Specify either ``scale=n`` or ``decimal_return_scale=n`` in order
258
+ to change this scale, or ``asdecimal=False`` to return values
259
+ directly as Python floating points.
260
+
261
+ :param precision: Total digits in this number. If scale and precision
262
+ are both None, values are stored to limits allowed by the server.
263
+
264
+ :param scale: The number of digits after the decimal point.
265
+
266
+ :param unsigned: a boolean, optional.
267
+
268
+ :param zerofill: Optional. If true, values will be stored as strings
269
+ left-padded with zeros. Note that this does not effect the values
270
+ returned by the underlying database API, which continue to be
271
+ numeric.
272
+
273
+ """
274
+ super().__init__(
275
+ precision=precision, scale=scale, asdecimal=asdecimal, **kw
276
+ )
277
+
278
+
279
+ class FLOAT(_FloatType, sqltypes.FLOAT[Union[decimal.Decimal, float]]):
280
+ """MySQL FLOAT type."""
281
+
282
+ __visit_name__ = "FLOAT"
283
+
284
+ def __init__(
285
+ self,
286
+ precision: Optional[int] = None,
287
+ scale: Optional[int] = None,
288
+ asdecimal: bool = False,
289
+ **kw: Any,
290
+ ):
291
+ """Construct a FLOAT.
292
+
293
+ :param precision: Total digits in this number. If scale and precision
294
+ are both None, values are stored to limits allowed by the server.
295
+
296
+ :param scale: The number of digits after the decimal point.
297
+
298
+ :param unsigned: a boolean, optional.
299
+
300
+ :param zerofill: Optional. If true, values will be stored as strings
301
+ left-padded with zeros. Note that this does not effect the values
302
+ returned by the underlying database API, which continue to be
303
+ numeric.
304
+
305
+ """
306
+ super().__init__(
307
+ precision=precision, scale=scale, asdecimal=asdecimal, **kw
308
+ )
309
+
310
+ def bind_processor(
311
+ self, dialect: Dialect
312
+ ) -> Optional[_BindProcessorType[Union[decimal.Decimal, float]]]:
313
+ return None
314
+
315
+
316
+ class INTEGER(_IntegerType, sqltypes.INTEGER):
317
+ """MySQL INTEGER type."""
318
+
319
+ __visit_name__ = "INTEGER"
320
+
321
+ def __init__(self, display_width: Optional[int] = None, **kw: Any):
322
+ """Construct an INTEGER.
323
+
324
+ :param display_width: Optional, maximum display width for this number.
325
+
326
+ :param unsigned: a boolean, optional.
327
+
328
+ :param zerofill: Optional. If true, values will be stored as strings
329
+ left-padded with zeros. Note that this does not effect the values
330
+ returned by the underlying database API, which continue to be
331
+ numeric.
332
+
333
+ """
334
+ super().__init__(display_width=display_width, **kw)
335
+
336
+
337
+ class BIGINT(_IntegerType, sqltypes.BIGINT):
338
+ """MySQL BIGINTEGER type."""
339
+
340
+ __visit_name__ = "BIGINT"
341
+
342
+ def __init__(self, display_width: Optional[int] = None, **kw: Any):
343
+ """Construct a BIGINTEGER.
344
+
345
+ :param display_width: Optional, maximum display width for this number.
346
+
347
+ :param unsigned: a boolean, optional.
348
+
349
+ :param zerofill: Optional. If true, values will be stored as strings
350
+ left-padded with zeros. Note that this does not effect the values
351
+ returned by the underlying database API, which continue to be
352
+ numeric.
353
+
354
+ """
355
+ super().__init__(display_width=display_width, **kw)
356
+
357
+
358
+ class MEDIUMINT(_IntegerType):
359
+ """MySQL MEDIUMINTEGER type."""
360
+
361
+ __visit_name__ = "MEDIUMINT"
362
+
363
+ def __init__(self, display_width: Optional[int] = None, **kw: Any):
364
+ """Construct a MEDIUMINTEGER
365
+
366
+ :param display_width: Optional, maximum display width for this number.
367
+
368
+ :param unsigned: a boolean, optional.
369
+
370
+ :param zerofill: Optional. If true, values will be stored as strings
371
+ left-padded with zeros. Note that this does not effect the values
372
+ returned by the underlying database API, which continue to be
373
+ numeric.
374
+
375
+ """
376
+ super().__init__(display_width=display_width, **kw)
377
+
378
+
379
+ class TINYINT(_IntegerType):
380
+ """MySQL TINYINT type."""
381
+
382
+ __visit_name__ = "TINYINT"
383
+
384
+ def __init__(self, display_width: Optional[int] = None, **kw: Any):
385
+ """Construct a TINYINT.
386
+
387
+ :param display_width: Optional, maximum display width for this number.
388
+
389
+ :param unsigned: a boolean, optional.
390
+
391
+ :param zerofill: Optional. If true, values will be stored as strings
392
+ left-padded with zeros. Note that this does not effect the values
393
+ returned by the underlying database API, which continue to be
394
+ numeric.
395
+
396
+ """
397
+ super().__init__(display_width=display_width, **kw)
398
+
399
+ def _compare_type_affinity(self, other: TypeEngine[Any]) -> bool:
400
+ return (
401
+ self._type_affinity is other._type_affinity
402
+ or other._type_affinity is sqltypes.Boolean
403
+ )
404
+
405
+
406
+ class SMALLINT(_IntegerType, sqltypes.SMALLINT):
407
+ """MySQL SMALLINTEGER type."""
408
+
409
+ __visit_name__ = "SMALLINT"
410
+
411
+ def __init__(self, display_width: Optional[int] = None, **kw: Any):
412
+ """Construct a SMALLINTEGER.
413
+
414
+ :param display_width: Optional, maximum display width for this number.
415
+
416
+ :param unsigned: a boolean, optional.
417
+
418
+ :param zerofill: Optional. If true, values will be stored as strings
419
+ left-padded with zeros. Note that this does not effect the values
420
+ returned by the underlying database API, which continue to be
421
+ numeric.
422
+
423
+ """
424
+ super().__init__(display_width=display_width, **kw)
425
+
426
+
427
+ class BIT(sqltypes.TypeEngine[Any]):
428
+ """MySQL BIT type.
429
+
430
+ This type is for MySQL 5.0.3 or greater for MyISAM, and 5.0.5 or greater
431
+ for MyISAM, MEMORY, InnoDB and BDB. For older versions, use a
432
+ MSTinyInteger() type.
433
+
434
+ """
435
+
436
+ __visit_name__ = "BIT"
437
+
438
+ def __init__(self, length: Optional[int] = None):
439
+ """Construct a BIT.
440
+
441
+ :param length: Optional, number of bits.
442
+
443
+ """
444
+ self.length = length
445
+
446
+ def result_processor(
447
+ self, dialect: MySQLDialect, coltype: object # type: ignore[override]
448
+ ) -> Optional[_ResultProcessorType[Any]]:
449
+ """Convert a MySQL's 64 bit, variable length binary string to a
450
+ long."""
451
+
452
+ if dialect.supports_native_bit:
453
+ return None
454
+
455
+ def process(value: Optional[Iterable[int]]) -> Optional[int]:
456
+ if value is not None:
457
+ v = 0
458
+ for i in value:
459
+ v = v << 8 | i
460
+ return v
461
+ return value
462
+
463
+ return process
464
+
465
+
466
+ class TIME(sqltypes.TIME):
467
+ """MySQL TIME type."""
468
+
469
+ __visit_name__ = "TIME"
470
+
471
+ def __init__(self, timezone: bool = False, fsp: Optional[int] = None):
472
+ """Construct a MySQL TIME type.
473
+
474
+ :param timezone: not used by the MySQL dialect.
475
+ :param fsp: fractional seconds precision value.
476
+ MySQL 5.6 supports storage of fractional seconds;
477
+ this parameter will be used when emitting DDL
478
+ for the TIME type.
479
+
480
+ .. note::
481
+
482
+ DBAPI driver support for fractional seconds may
483
+ be limited; current support includes
484
+ MySQL Connector/Python.
485
+
486
+ """
487
+ super().__init__(timezone=timezone)
488
+ self.fsp = fsp
489
+
490
+ def result_processor(
491
+ self, dialect: Dialect, coltype: object
492
+ ) -> _ResultProcessorType[datetime.time]:
493
+ time = datetime.time
494
+
495
+ def process(value: Any) -> Optional[datetime.time]:
496
+ # convert from a timedelta value
497
+ if value is not None:
498
+ microseconds = value.microseconds
499
+ seconds = value.seconds
500
+ minutes = seconds // 60
501
+ return time(
502
+ minutes // 60,
503
+ minutes % 60,
504
+ seconds - minutes * 60,
505
+ microsecond=microseconds,
506
+ )
507
+ else:
508
+ return None
509
+
510
+ return process
511
+
512
+
513
+ class TIMESTAMP(sqltypes.TIMESTAMP):
514
+ """MySQL TIMESTAMP type."""
515
+
516
+ __visit_name__ = "TIMESTAMP"
517
+
518
+ def __init__(self, timezone: bool = False, fsp: Optional[int] = None):
519
+ """Construct a MySQL TIMESTAMP type.
520
+
521
+ :param timezone: not used by the MySQL dialect.
522
+ :param fsp: fractional seconds precision value.
523
+ MySQL 5.6.4 supports storage of fractional seconds;
524
+ this parameter will be used when emitting DDL
525
+ for the TIMESTAMP type.
526
+
527
+ .. note::
528
+
529
+ DBAPI driver support for fractional seconds may
530
+ be limited; current support includes
531
+ MySQL Connector/Python.
532
+
533
+ """
534
+ super().__init__(timezone=timezone)
535
+ self.fsp = fsp
536
+
537
+
538
+ class DATETIME(sqltypes.DATETIME):
539
+ """MySQL DATETIME type."""
540
+
541
+ __visit_name__ = "DATETIME"
542
+
543
+ def __init__(self, timezone: bool = False, fsp: Optional[int] = None):
544
+ """Construct a MySQL DATETIME type.
545
+
546
+ :param timezone: not used by the MySQL dialect.
547
+ :param fsp: fractional seconds precision value.
548
+ MySQL 5.6.4 supports storage of fractional seconds;
549
+ this parameter will be used when emitting DDL
550
+ for the DATETIME type.
551
+
552
+ .. note::
553
+
554
+ DBAPI driver support for fractional seconds may
555
+ be limited; current support includes
556
+ MySQL Connector/Python.
557
+
558
+ """
559
+ super().__init__(timezone=timezone)
560
+ self.fsp = fsp
561
+
562
+
563
+ class YEAR(sqltypes.TypeEngine[Any]):
564
+ """MySQL YEAR type, for single byte storage of years 1901-2155."""
565
+
566
+ __visit_name__ = "YEAR"
567
+
568
+ def __init__(self, display_width: Optional[int] = None):
569
+ self.display_width = display_width
570
+
571
+
572
+ class TEXT(_StringType, sqltypes.TEXT):
573
+ """MySQL TEXT type, for character storage encoded up to 2^16 bytes."""
574
+
575
+ __visit_name__ = "TEXT"
576
+
577
+ def __init__(self, length: Optional[int] = None, **kw: Any):
578
+ """Construct a TEXT.
579
+
580
+ :param length: Optional, if provided the server may optimize storage
581
+ by substituting the smallest TEXT type sufficient to store
582
+ ``length`` bytes of characters.
583
+
584
+ :param charset: Optional, a column-level character set for this string
585
+ value. Takes precedence to 'ascii' or 'unicode' short-hand.
586
+
587
+ :param collation: Optional, a column-level collation for this string
588
+ value. Takes precedence to 'binary' short-hand.
589
+
590
+ :param ascii: Defaults to False: short-hand for the ``latin1``
591
+ character set, generates ASCII in schema.
592
+
593
+ :param unicode: Defaults to False: short-hand for the ``ucs2``
594
+ character set, generates UNICODE in schema.
595
+
596
+ :param national: Optional. If true, use the server's configured
597
+ national character set.
598
+
599
+ :param binary: Defaults to False: short-hand, pick the binary
600
+ collation type that matches the column's character set. Generates
601
+ BINARY in schema. This does not affect the type of data stored,
602
+ only the collation of character data.
603
+
604
+ """
605
+ super().__init__(length=length, **kw)
606
+
607
+
608
+ class TINYTEXT(_StringType):
609
+ """MySQL TINYTEXT type, for character storage encoded up to 2^8 bytes."""
610
+
611
+ __visit_name__ = "TINYTEXT"
612
+
613
+ def __init__(self, **kwargs: Any):
614
+ """Construct a TINYTEXT.
615
+
616
+ :param charset: Optional, a column-level character set for this string
617
+ value. Takes precedence to 'ascii' or 'unicode' short-hand.
618
+
619
+ :param collation: Optional, a column-level collation for this string
620
+ value. Takes precedence to 'binary' short-hand.
621
+
622
+ :param ascii: Defaults to False: short-hand for the ``latin1``
623
+ character set, generates ASCII in schema.
624
+
625
+ :param unicode: Defaults to False: short-hand for the ``ucs2``
626
+ character set, generates UNICODE in schema.
627
+
628
+ :param national: Optional. If true, use the server's configured
629
+ national character set.
630
+
631
+ :param binary: Defaults to False: short-hand, pick the binary
632
+ collation type that matches the column's character set. Generates
633
+ BINARY in schema. This does not affect the type of data stored,
634
+ only the collation of character data.
635
+
636
+ """
637
+ super().__init__(**kwargs)
638
+
639
+
640
+ class MEDIUMTEXT(_StringType):
641
+ """MySQL MEDIUMTEXT type, for character storage encoded up
642
+ to 2^24 bytes."""
643
+
644
+ __visit_name__ = "MEDIUMTEXT"
645
+
646
+ def __init__(self, **kwargs: Any):
647
+ """Construct a MEDIUMTEXT.
648
+
649
+ :param charset: Optional, a column-level character set for this string
650
+ value. Takes precedence to 'ascii' or 'unicode' short-hand.
651
+
652
+ :param collation: Optional, a column-level collation for this string
653
+ value. Takes precedence to 'binary' short-hand.
654
+
655
+ :param ascii: Defaults to False: short-hand for the ``latin1``
656
+ character set, generates ASCII in schema.
657
+
658
+ :param unicode: Defaults to False: short-hand for the ``ucs2``
659
+ character set, generates UNICODE in schema.
660
+
661
+ :param national: Optional. If true, use the server's configured
662
+ national character set.
663
+
664
+ :param binary: Defaults to False: short-hand, pick the binary
665
+ collation type that matches the column's character set. Generates
666
+ BINARY in schema. This does not affect the type of data stored,
667
+ only the collation of character data.
668
+
669
+ """
670
+ super().__init__(**kwargs)
671
+
672
+
673
+ class LONGTEXT(_StringType):
674
+ """MySQL LONGTEXT type, for character storage encoded up to 2^32 bytes."""
675
+
676
+ __visit_name__ = "LONGTEXT"
677
+
678
+ def __init__(self, **kwargs: Any):
679
+ """Construct a LONGTEXT.
680
+
681
+ :param charset: Optional, a column-level character set for this string
682
+ value. Takes precedence to 'ascii' or 'unicode' short-hand.
683
+
684
+ :param collation: Optional, a column-level collation for this string
685
+ value. Takes precedence to 'binary' short-hand.
686
+
687
+ :param ascii: Defaults to False: short-hand for the ``latin1``
688
+ character set, generates ASCII in schema.
689
+
690
+ :param unicode: Defaults to False: short-hand for the ``ucs2``
691
+ character set, generates UNICODE in schema.
692
+
693
+ :param national: Optional. If true, use the server's configured
694
+ national character set.
695
+
696
+ :param binary: Defaults to False: short-hand, pick the binary
697
+ collation type that matches the column's character set. Generates
698
+ BINARY in schema. This does not affect the type of data stored,
699
+ only the collation of character data.
700
+
701
+ """
702
+ super().__init__(**kwargs)
703
+
704
+
705
+ class VARCHAR(_StringType, sqltypes.VARCHAR):
706
+ """MySQL VARCHAR type, for variable-length character data."""
707
+
708
+ __visit_name__ = "VARCHAR"
709
+
710
+ def __init__(self, length: Optional[int] = None, **kwargs: Any) -> None:
711
+ """Construct a VARCHAR.
712
+
713
+ :param charset: Optional, a column-level character set for this string
714
+ value. Takes precedence to 'ascii' or 'unicode' short-hand.
715
+
716
+ :param collation: Optional, a column-level collation for this string
717
+ value. Takes precedence to 'binary' short-hand.
718
+
719
+ :param ascii: Defaults to False: short-hand for the ``latin1``
720
+ character set, generates ASCII in schema.
721
+
722
+ :param unicode: Defaults to False: short-hand for the ``ucs2``
723
+ character set, generates UNICODE in schema.
724
+
725
+ :param national: Optional. If true, use the server's configured
726
+ national character set.
727
+
728
+ :param binary: Defaults to False: short-hand, pick the binary
729
+ collation type that matches the column's character set. Generates
730
+ BINARY in schema. This does not affect the type of data stored,
731
+ only the collation of character data.
732
+
733
+ """
734
+ super().__init__(length=length, **kwargs)
735
+
736
+
737
+ class CHAR(_StringType, sqltypes.CHAR):
738
+ """MySQL CHAR type, for fixed-length character data."""
739
+
740
+ __visit_name__ = "CHAR"
741
+
742
+ def __init__(self, length: Optional[int] = None, **kwargs: Any):
743
+ """Construct a CHAR.
744
+
745
+ :param length: Maximum data length, in characters.
746
+
747
+ :param binary: Optional, use the default binary collation for the
748
+ national character set. This does not affect the type of data
749
+ stored, use a BINARY type for binary data.
750
+
751
+ :param collation: Optional, request a particular collation. Must be
752
+ compatible with the national character set.
753
+
754
+ """
755
+ super().__init__(length=length, **kwargs)
756
+
757
+ @classmethod
758
+ def _adapt_string_for_cast(cls, type_: sqltypes.String) -> sqltypes.CHAR:
759
+ # copy the given string type into a CHAR
760
+ # for the purposes of rendering a CAST expression
761
+ type_ = sqltypes.to_instance(type_)
762
+ if isinstance(type_, sqltypes.CHAR):
763
+ return type_
764
+ elif isinstance(type_, _StringType):
765
+ return CHAR(
766
+ length=type_.length,
767
+ charset=type_.charset,
768
+ collation=type_.collation,
769
+ ascii=type_.ascii,
770
+ binary=type_.binary,
771
+ unicode=type_.unicode,
772
+ national=False, # not supported in CAST
773
+ )
774
+ else:
775
+ return CHAR(length=type_.length)
776
+
777
+
778
+ class NVARCHAR(_StringType, sqltypes.NVARCHAR):
779
+ """MySQL NVARCHAR type.
780
+
781
+ For variable-length character data in the server's configured national
782
+ character set.
783
+ """
784
+
785
+ __visit_name__ = "NVARCHAR"
786
+
787
+ def __init__(self, length: Optional[int] = None, **kwargs: Any):
788
+ """Construct an NVARCHAR.
789
+
790
+ :param length: Maximum data length, in characters.
791
+
792
+ :param binary: Optional, use the default binary collation for the
793
+ national character set. This does not affect the type of data
794
+ stored, use a BINARY type for binary data.
795
+
796
+ :param collation: Optional, request a particular collation. Must be
797
+ compatible with the national character set.
798
+
799
+ """
800
+ kwargs["national"] = True
801
+ super().__init__(length=length, **kwargs)
802
+
803
+
804
+ class NCHAR(_StringType, sqltypes.NCHAR):
805
+ """MySQL NCHAR type.
806
+
807
+ For fixed-length character data in the server's configured national
808
+ character set.
809
+ """
810
+
811
+ __visit_name__ = "NCHAR"
812
+
813
+ def __init__(self, length: Optional[int] = None, **kwargs: Any):
814
+ """Construct an NCHAR.
815
+
816
+ :param length: Maximum data length, in characters.
817
+
818
+ :param binary: Optional, use the default binary collation for the
819
+ national character set. This does not affect the type of data
820
+ stored, use a BINARY type for binary data.
821
+
822
+ :param collation: Optional, request a particular collation. Must be
823
+ compatible with the national character set.
824
+
825
+ """
826
+ kwargs["national"] = True
827
+ super().__init__(length=length, **kwargs)
828
+
829
+
830
+ class TINYBLOB(sqltypes._Binary):
831
+ """MySQL TINYBLOB type, for binary data up to 2^8 bytes."""
832
+
833
+ __visit_name__ = "TINYBLOB"
834
+
835
+
836
+ class MEDIUMBLOB(sqltypes._Binary):
837
+ """MySQL MEDIUMBLOB type, for binary data up to 2^24 bytes."""
838
+
839
+ __visit_name__ = "MEDIUMBLOB"
840
+
841
+
842
+ class LONGBLOB(sqltypes._Binary):
843
+ """MySQL LONGBLOB type, for binary data up to 2^32 bytes."""
844
+
845
+ __visit_name__ = "LONGBLOB"