SQLAlchemy 2.0.47__cp313-cp313t-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 (274) hide show
  1. sqlalchemy/__init__.py +283 -0
  2. sqlalchemy/connectors/__init__.py +18 -0
  3. sqlalchemy/connectors/aioodbc.py +184 -0
  4. sqlalchemy/connectors/asyncio.py +429 -0
  5. sqlalchemy/connectors/pyodbc.py +250 -0
  6. sqlalchemy/cyextension/__init__.py +6 -0
  7. sqlalchemy/cyextension/collections.cp313t-win32.pyd +0 -0
  8. sqlalchemy/cyextension/collections.pyx +409 -0
  9. sqlalchemy/cyextension/immutabledict.cp313t-win32.pyd +0 -0
  10. sqlalchemy/cyextension/immutabledict.pxd +8 -0
  11. sqlalchemy/cyextension/immutabledict.pyx +133 -0
  12. sqlalchemy/cyextension/processors.cp313t-win32.pyd +0 -0
  13. sqlalchemy/cyextension/processors.pyx +68 -0
  14. sqlalchemy/cyextension/resultproxy.cp313t-win32.pyd +0 -0
  15. sqlalchemy/cyextension/resultproxy.pyx +102 -0
  16. sqlalchemy/cyextension/util.cp313t-win32.pyd +0 -0
  17. sqlalchemy/cyextension/util.pyx +90 -0
  18. sqlalchemy/dialects/__init__.py +62 -0
  19. sqlalchemy/dialects/_typing.py +30 -0
  20. sqlalchemy/dialects/mssql/__init__.py +88 -0
  21. sqlalchemy/dialects/mssql/aioodbc.py +63 -0
  22. sqlalchemy/dialects/mssql/base.py +4093 -0
  23. sqlalchemy/dialects/mssql/information_schema.py +285 -0
  24. sqlalchemy/dialects/mssql/json.py +129 -0
  25. sqlalchemy/dialects/mssql/provision.py +185 -0
  26. sqlalchemy/dialects/mssql/pymssql.py +126 -0
  27. sqlalchemy/dialects/mssql/pyodbc.py +760 -0
  28. sqlalchemy/dialects/mysql/__init__.py +104 -0
  29. sqlalchemy/dialects/mysql/aiomysql.py +250 -0
  30. sqlalchemy/dialects/mysql/asyncmy.py +231 -0
  31. sqlalchemy/dialects/mysql/base.py +3949 -0
  32. sqlalchemy/dialects/mysql/cymysql.py +106 -0
  33. sqlalchemy/dialects/mysql/dml.py +225 -0
  34. sqlalchemy/dialects/mysql/enumerated.py +282 -0
  35. sqlalchemy/dialects/mysql/expression.py +146 -0
  36. sqlalchemy/dialects/mysql/json.py +91 -0
  37. sqlalchemy/dialects/mysql/mariadb.py +72 -0
  38. sqlalchemy/dialects/mysql/mariadbconnector.py +322 -0
  39. sqlalchemy/dialects/mysql/mysqlconnector.py +302 -0
  40. sqlalchemy/dialects/mysql/mysqldb.py +314 -0
  41. sqlalchemy/dialects/mysql/provision.py +153 -0
  42. sqlalchemy/dialects/mysql/pymysql.py +158 -0
  43. sqlalchemy/dialects/mysql/pyodbc.py +157 -0
  44. sqlalchemy/dialects/mysql/reflection.py +727 -0
  45. sqlalchemy/dialects/mysql/reserved_words.py +570 -0
  46. sqlalchemy/dialects/mysql/types.py +835 -0
  47. sqlalchemy/dialects/oracle/__init__.py +81 -0
  48. sqlalchemy/dialects/oracle/base.py +3802 -0
  49. sqlalchemy/dialects/oracle/cx_oracle.py +1555 -0
  50. sqlalchemy/dialects/oracle/dictionary.py +507 -0
  51. sqlalchemy/dialects/oracle/oracledb.py +941 -0
  52. sqlalchemy/dialects/oracle/provision.py +297 -0
  53. sqlalchemy/dialects/oracle/types.py +316 -0
  54. sqlalchemy/dialects/oracle/vector.py +365 -0
  55. sqlalchemy/dialects/postgresql/__init__.py +167 -0
  56. sqlalchemy/dialects/postgresql/_psycopg_common.py +189 -0
  57. sqlalchemy/dialects/postgresql/array.py +519 -0
  58. sqlalchemy/dialects/postgresql/asyncpg.py +1284 -0
  59. sqlalchemy/dialects/postgresql/base.py +5378 -0
  60. sqlalchemy/dialects/postgresql/dml.py +339 -0
  61. sqlalchemy/dialects/postgresql/ext.py +540 -0
  62. sqlalchemy/dialects/postgresql/hstore.py +406 -0
  63. sqlalchemy/dialects/postgresql/json.py +404 -0
  64. sqlalchemy/dialects/postgresql/named_types.py +524 -0
  65. sqlalchemy/dialects/postgresql/operators.py +129 -0
  66. sqlalchemy/dialects/postgresql/pg8000.py +669 -0
  67. sqlalchemy/dialects/postgresql/pg_catalog.py +326 -0
  68. sqlalchemy/dialects/postgresql/provision.py +183 -0
  69. sqlalchemy/dialects/postgresql/psycopg.py +862 -0
  70. sqlalchemy/dialects/postgresql/psycopg2.py +892 -0
  71. sqlalchemy/dialects/postgresql/psycopg2cffi.py +61 -0
  72. sqlalchemy/dialects/postgresql/ranges.py +1031 -0
  73. sqlalchemy/dialects/postgresql/types.py +313 -0
  74. sqlalchemy/dialects/sqlite/__init__.py +57 -0
  75. sqlalchemy/dialects/sqlite/aiosqlite.py +482 -0
  76. sqlalchemy/dialects/sqlite/base.py +3056 -0
  77. sqlalchemy/dialects/sqlite/dml.py +263 -0
  78. sqlalchemy/dialects/sqlite/json.py +92 -0
  79. sqlalchemy/dialects/sqlite/provision.py +229 -0
  80. sqlalchemy/dialects/sqlite/pysqlcipher.py +157 -0
  81. sqlalchemy/dialects/sqlite/pysqlite.py +756 -0
  82. sqlalchemy/dialects/type_migration_guidelines.txt +145 -0
  83. sqlalchemy/engine/__init__.py +62 -0
  84. sqlalchemy/engine/_py_processors.py +136 -0
  85. sqlalchemy/engine/_py_row.py +128 -0
  86. sqlalchemy/engine/_py_util.py +74 -0
  87. sqlalchemy/engine/base.py +3390 -0
  88. sqlalchemy/engine/characteristics.py +155 -0
  89. sqlalchemy/engine/create.py +893 -0
  90. sqlalchemy/engine/cursor.py +2298 -0
  91. sqlalchemy/engine/default.py +2394 -0
  92. sqlalchemy/engine/events.py +965 -0
  93. sqlalchemy/engine/interfaces.py +3471 -0
  94. sqlalchemy/engine/mock.py +134 -0
  95. sqlalchemy/engine/processors.py +61 -0
  96. sqlalchemy/engine/reflection.py +2102 -0
  97. sqlalchemy/engine/result.py +2399 -0
  98. sqlalchemy/engine/row.py +400 -0
  99. sqlalchemy/engine/strategies.py +16 -0
  100. sqlalchemy/engine/url.py +924 -0
  101. sqlalchemy/engine/util.py +167 -0
  102. sqlalchemy/event/__init__.py +26 -0
  103. sqlalchemy/event/api.py +220 -0
  104. sqlalchemy/event/attr.py +676 -0
  105. sqlalchemy/event/base.py +472 -0
  106. sqlalchemy/event/legacy.py +258 -0
  107. sqlalchemy/event/registry.py +390 -0
  108. sqlalchemy/events.py +17 -0
  109. sqlalchemy/exc.py +832 -0
  110. sqlalchemy/ext/__init__.py +11 -0
  111. sqlalchemy/ext/associationproxy.py +2027 -0
  112. sqlalchemy/ext/asyncio/__init__.py +25 -0
  113. sqlalchemy/ext/asyncio/base.py +281 -0
  114. sqlalchemy/ext/asyncio/engine.py +1471 -0
  115. sqlalchemy/ext/asyncio/exc.py +21 -0
  116. sqlalchemy/ext/asyncio/result.py +965 -0
  117. sqlalchemy/ext/asyncio/scoping.py +1599 -0
  118. sqlalchemy/ext/asyncio/session.py +1947 -0
  119. sqlalchemy/ext/automap.py +1701 -0
  120. sqlalchemy/ext/baked.py +570 -0
  121. sqlalchemy/ext/compiler.py +600 -0
  122. sqlalchemy/ext/declarative/__init__.py +65 -0
  123. sqlalchemy/ext/declarative/extensions.py +564 -0
  124. sqlalchemy/ext/horizontal_shard.py +478 -0
  125. sqlalchemy/ext/hybrid.py +1535 -0
  126. sqlalchemy/ext/indexable.py +364 -0
  127. sqlalchemy/ext/instrumentation.py +450 -0
  128. sqlalchemy/ext/mutable.py +1085 -0
  129. sqlalchemy/ext/mypy/__init__.py +6 -0
  130. sqlalchemy/ext/mypy/apply.py +324 -0
  131. sqlalchemy/ext/mypy/decl_class.py +515 -0
  132. sqlalchemy/ext/mypy/infer.py +590 -0
  133. sqlalchemy/ext/mypy/names.py +335 -0
  134. sqlalchemy/ext/mypy/plugin.py +303 -0
  135. sqlalchemy/ext/mypy/util.py +357 -0
  136. sqlalchemy/ext/orderinglist.py +439 -0
  137. sqlalchemy/ext/serializer.py +185 -0
  138. sqlalchemy/future/__init__.py +16 -0
  139. sqlalchemy/future/engine.py +15 -0
  140. sqlalchemy/inspection.py +174 -0
  141. sqlalchemy/log.py +288 -0
  142. sqlalchemy/orm/__init__.py +171 -0
  143. sqlalchemy/orm/_orm_constructors.py +2661 -0
  144. sqlalchemy/orm/_typing.py +179 -0
  145. sqlalchemy/orm/attributes.py +2845 -0
  146. sqlalchemy/orm/base.py +971 -0
  147. sqlalchemy/orm/bulk_persistence.py +2135 -0
  148. sqlalchemy/orm/clsregistry.py +571 -0
  149. sqlalchemy/orm/collections.py +1627 -0
  150. sqlalchemy/orm/context.py +3334 -0
  151. sqlalchemy/orm/decl_api.py +2004 -0
  152. sqlalchemy/orm/decl_base.py +2192 -0
  153. sqlalchemy/orm/dependency.py +1302 -0
  154. sqlalchemy/orm/descriptor_props.py +1092 -0
  155. sqlalchemy/orm/dynamic.py +300 -0
  156. sqlalchemy/orm/evaluator.py +379 -0
  157. sqlalchemy/orm/events.py +3252 -0
  158. sqlalchemy/orm/exc.py +237 -0
  159. sqlalchemy/orm/identity.py +302 -0
  160. sqlalchemy/orm/instrumentation.py +754 -0
  161. sqlalchemy/orm/interfaces.py +1496 -0
  162. sqlalchemy/orm/loading.py +1686 -0
  163. sqlalchemy/orm/mapped_collection.py +557 -0
  164. sqlalchemy/orm/mapper.py +4444 -0
  165. sqlalchemy/orm/path_registry.py +809 -0
  166. sqlalchemy/orm/persistence.py +1788 -0
  167. sqlalchemy/orm/properties.py +935 -0
  168. sqlalchemy/orm/query.py +3459 -0
  169. sqlalchemy/orm/relationships.py +3508 -0
  170. sqlalchemy/orm/scoping.py +2148 -0
  171. sqlalchemy/orm/session.py +5280 -0
  172. sqlalchemy/orm/state.py +1168 -0
  173. sqlalchemy/orm/state_changes.py +196 -0
  174. sqlalchemy/orm/strategies.py +3470 -0
  175. sqlalchemy/orm/strategy_options.py +2568 -0
  176. sqlalchemy/orm/sync.py +164 -0
  177. sqlalchemy/orm/unitofwork.py +796 -0
  178. sqlalchemy/orm/util.py +2403 -0
  179. sqlalchemy/orm/writeonly.py +674 -0
  180. sqlalchemy/pool/__init__.py +44 -0
  181. sqlalchemy/pool/base.py +1524 -0
  182. sqlalchemy/pool/events.py +375 -0
  183. sqlalchemy/pool/impl.py +588 -0
  184. sqlalchemy/py.typed +0 -0
  185. sqlalchemy/schema.py +69 -0
  186. sqlalchemy/sql/__init__.py +145 -0
  187. sqlalchemy/sql/_dml_constructors.py +132 -0
  188. sqlalchemy/sql/_elements_constructors.py +1872 -0
  189. sqlalchemy/sql/_orm_types.py +20 -0
  190. sqlalchemy/sql/_py_util.py +75 -0
  191. sqlalchemy/sql/_selectable_constructors.py +763 -0
  192. sqlalchemy/sql/_typing.py +482 -0
  193. sqlalchemy/sql/annotation.py +587 -0
  194. sqlalchemy/sql/base.py +2293 -0
  195. sqlalchemy/sql/cache_key.py +1057 -0
  196. sqlalchemy/sql/coercions.py +1404 -0
  197. sqlalchemy/sql/compiler.py +8081 -0
  198. sqlalchemy/sql/crud.py +1752 -0
  199. sqlalchemy/sql/ddl.py +1444 -0
  200. sqlalchemy/sql/default_comparator.py +551 -0
  201. sqlalchemy/sql/dml.py +1850 -0
  202. sqlalchemy/sql/elements.py +5589 -0
  203. sqlalchemy/sql/events.py +458 -0
  204. sqlalchemy/sql/expression.py +159 -0
  205. sqlalchemy/sql/functions.py +2158 -0
  206. sqlalchemy/sql/lambdas.py +1442 -0
  207. sqlalchemy/sql/naming.py +209 -0
  208. sqlalchemy/sql/operators.py +2623 -0
  209. sqlalchemy/sql/roles.py +323 -0
  210. sqlalchemy/sql/schema.py +6222 -0
  211. sqlalchemy/sql/selectable.py +7265 -0
  212. sqlalchemy/sql/sqltypes.py +3930 -0
  213. sqlalchemy/sql/traversals.py +1024 -0
  214. sqlalchemy/sql/type_api.py +2368 -0
  215. sqlalchemy/sql/util.py +1485 -0
  216. sqlalchemy/sql/visitors.py +1164 -0
  217. sqlalchemy/testing/__init__.py +96 -0
  218. sqlalchemy/testing/assertions.py +994 -0
  219. sqlalchemy/testing/assertsql.py +520 -0
  220. sqlalchemy/testing/asyncio.py +135 -0
  221. sqlalchemy/testing/config.py +434 -0
  222. sqlalchemy/testing/engines.py +483 -0
  223. sqlalchemy/testing/entities.py +117 -0
  224. sqlalchemy/testing/exclusions.py +476 -0
  225. sqlalchemy/testing/fixtures/__init__.py +28 -0
  226. sqlalchemy/testing/fixtures/base.py +384 -0
  227. sqlalchemy/testing/fixtures/mypy.py +332 -0
  228. sqlalchemy/testing/fixtures/orm.py +227 -0
  229. sqlalchemy/testing/fixtures/sql.py +482 -0
  230. sqlalchemy/testing/pickleable.py +155 -0
  231. sqlalchemy/testing/plugin/__init__.py +6 -0
  232. sqlalchemy/testing/plugin/bootstrap.py +51 -0
  233. sqlalchemy/testing/plugin/plugin_base.py +828 -0
  234. sqlalchemy/testing/plugin/pytestplugin.py +892 -0
  235. sqlalchemy/testing/profiling.py +329 -0
  236. sqlalchemy/testing/provision.py +603 -0
  237. sqlalchemy/testing/requirements.py +1945 -0
  238. sqlalchemy/testing/schema.py +198 -0
  239. sqlalchemy/testing/suite/__init__.py +19 -0
  240. sqlalchemy/testing/suite/test_cte.py +237 -0
  241. sqlalchemy/testing/suite/test_ddl.py +389 -0
  242. sqlalchemy/testing/suite/test_deprecations.py +153 -0
  243. sqlalchemy/testing/suite/test_dialect.py +776 -0
  244. sqlalchemy/testing/suite/test_insert.py +630 -0
  245. sqlalchemy/testing/suite/test_reflection.py +3557 -0
  246. sqlalchemy/testing/suite/test_results.py +504 -0
  247. sqlalchemy/testing/suite/test_rowcount.py +258 -0
  248. sqlalchemy/testing/suite/test_select.py +2010 -0
  249. sqlalchemy/testing/suite/test_sequence.py +317 -0
  250. sqlalchemy/testing/suite/test_types.py +2147 -0
  251. sqlalchemy/testing/suite/test_unicode_ddl.py +189 -0
  252. sqlalchemy/testing/suite/test_update_delete.py +139 -0
  253. sqlalchemy/testing/util.py +535 -0
  254. sqlalchemy/testing/warnings.py +52 -0
  255. sqlalchemy/types.py +74 -0
  256. sqlalchemy/util/__init__.py +162 -0
  257. sqlalchemy/util/_collections.py +712 -0
  258. sqlalchemy/util/_concurrency_py3k.py +288 -0
  259. sqlalchemy/util/_has_cy.py +40 -0
  260. sqlalchemy/util/_py_collections.py +541 -0
  261. sqlalchemy/util/compat.py +421 -0
  262. sqlalchemy/util/concurrency.py +110 -0
  263. sqlalchemy/util/deprecations.py +401 -0
  264. sqlalchemy/util/langhelpers.py +2203 -0
  265. sqlalchemy/util/preloaded.py +150 -0
  266. sqlalchemy/util/queue.py +322 -0
  267. sqlalchemy/util/tool_support.py +201 -0
  268. sqlalchemy/util/topological.py +120 -0
  269. sqlalchemy/util/typing.py +734 -0
  270. sqlalchemy-2.0.47.dist-info/METADATA +243 -0
  271. sqlalchemy-2.0.47.dist-info/RECORD +274 -0
  272. sqlalchemy-2.0.47.dist-info/WHEEL +5 -0
  273. sqlalchemy-2.0.47.dist-info/licenses/LICENSE +19 -0
  274. sqlalchemy-2.0.47.dist-info/top_level.txt +1 -0
@@ -0,0 +1,102 @@
1
+ # cyextension/resultproxy.pyx
2
+ # Copyright (C) 2005-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
+ import operator
8
+
9
+ cdef class BaseRow:
10
+ cdef readonly object _parent
11
+ cdef readonly dict _key_to_index
12
+ cdef readonly tuple _data
13
+
14
+ def __init__(self, object parent, object processors, dict key_to_index, object data):
15
+ """Row objects are constructed by CursorResult objects."""
16
+
17
+ self._parent = parent
18
+
19
+ self._key_to_index = key_to_index
20
+
21
+ if processors:
22
+ self._data = _apply_processors(processors, data)
23
+ else:
24
+ self._data = tuple(data)
25
+
26
+ def __reduce__(self):
27
+ return (
28
+ rowproxy_reconstructor,
29
+ (self.__class__, self.__getstate__()),
30
+ )
31
+
32
+ def __getstate__(self):
33
+ return {"_parent": self._parent, "_data": self._data}
34
+
35
+ def __setstate__(self, dict state):
36
+ parent = state["_parent"]
37
+ self._parent = parent
38
+ self._data = state["_data"]
39
+ self._key_to_index = parent._key_to_index
40
+
41
+ def _values_impl(self):
42
+ return list(self)
43
+
44
+ def __iter__(self):
45
+ return iter(self._data)
46
+
47
+ def __len__(self):
48
+ return len(self._data)
49
+
50
+ def __hash__(self):
51
+ return hash(self._data)
52
+
53
+ def __getitem__(self, index):
54
+ return self._data[index]
55
+
56
+ def _get_by_key_impl_mapping(self, key):
57
+ return self._get_by_key_impl(key, 0)
58
+
59
+ cdef _get_by_key_impl(self, object key, int attr_err):
60
+ index = self._key_to_index.get(key)
61
+ if index is not None:
62
+ return self._data[<int>index]
63
+ self._parent._key_not_found(key, attr_err != 0)
64
+
65
+ def __getattr__(self, name):
66
+ return self._get_by_key_impl(name, 1)
67
+
68
+ def _to_tuple_instance(self):
69
+ return self._data
70
+
71
+
72
+ cdef tuple _apply_processors(proc, data):
73
+ res = []
74
+ for i in range(len(proc)):
75
+ p = proc[i]
76
+ if p is None:
77
+ res.append(data[i])
78
+ else:
79
+ res.append(p(data[i]))
80
+ return tuple(res)
81
+
82
+
83
+ def rowproxy_reconstructor(cls, state):
84
+ obj = cls.__new__(cls)
85
+ obj.__setstate__(state)
86
+ return obj
87
+
88
+
89
+ cdef int is_contiguous(tuple indexes):
90
+ cdef int i
91
+ for i in range(1, len(indexes)):
92
+ if indexes[i-1] != indexes[i] -1:
93
+ return 0
94
+ return 1
95
+
96
+
97
+ def tuplegetter(*indexes):
98
+ if len(indexes) == 1 or is_contiguous(indexes) != 0:
99
+ # slice form is faster but returns a list if input is list
100
+ return operator.itemgetter(slice(indexes[0], indexes[-1] + 1))
101
+ else:
102
+ return operator.itemgetter(*indexes)
@@ -0,0 +1,90 @@
1
+ # cyextension/util.pyx
2
+ # Copyright (C) 2005-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
+ from collections.abc import Mapping
8
+
9
+ from sqlalchemy import exc
10
+
11
+ cdef tuple _Empty_Tuple = ()
12
+
13
+ cdef inline bint _is_mapping_or_tuple(object value):
14
+ return isinstance(value, dict) or isinstance(value, tuple) or isinstance(value, Mapping)
15
+
16
+
17
+ cdef inline bint _is_mapping(object value):
18
+ return isinstance(value, dict) or isinstance(value, Mapping)
19
+
20
+
21
+ def _distill_params_20(object params):
22
+ if params is None:
23
+ return _Empty_Tuple
24
+ elif isinstance(params, list) or isinstance(params, tuple):
25
+ if params and not _is_mapping(params[0]):
26
+ raise exc.ArgumentError(
27
+ "List argument must consist only of dictionaries"
28
+ )
29
+ return params
30
+ elif _is_mapping(params):
31
+ return [params]
32
+ else:
33
+ raise exc.ArgumentError("mapping or list expected for parameters")
34
+
35
+
36
+ def _distill_raw_params(object params):
37
+ if params is None:
38
+ return _Empty_Tuple
39
+ elif isinstance(params, list):
40
+ if params and not _is_mapping_or_tuple(params[0]):
41
+ raise exc.ArgumentError(
42
+ "List argument must consist only of tuples or dictionaries"
43
+ )
44
+ return params
45
+ elif _is_mapping_or_tuple(params):
46
+ return [params]
47
+ else:
48
+ raise exc.ArgumentError("mapping or sequence expected for parameters")
49
+
50
+ cdef class prefix_anon_map(dict):
51
+ def __missing__(self, str key):
52
+ cdef str derived
53
+ cdef int anonymous_counter
54
+ cdef dict self_dict = self
55
+
56
+ derived = key.split(" ", 1)[1]
57
+
58
+ anonymous_counter = self_dict.get(derived, 1)
59
+ self_dict[derived] = anonymous_counter + 1
60
+ value = f"{derived}_{anonymous_counter}"
61
+ self_dict[key] = value
62
+ return value
63
+
64
+
65
+ cdef class cache_anon_map(dict):
66
+ cdef int _index
67
+
68
+ def __init__(self):
69
+ self._index = 0
70
+
71
+ def get_anon(self, obj):
72
+ cdef long long idself
73
+ cdef str id_
74
+ cdef dict self_dict = self
75
+
76
+ idself = id(obj)
77
+ if idself in self_dict:
78
+ return self_dict[idself], True
79
+ else:
80
+ id_ = self.__missing__(idself)
81
+ return id_, False
82
+
83
+ def __missing__(self, key):
84
+ cdef str val
85
+ cdef dict self_dict = self
86
+
87
+ self_dict[key] = val = str(self._index)
88
+ self._index += 1
89
+ return val
90
+
@@ -0,0 +1,62 @@
1
+ # dialects/__init__.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
+
8
+ from __future__ import annotations
9
+
10
+ from typing import Any
11
+ from typing import Callable
12
+ from typing import Optional
13
+ from typing import Type
14
+ from typing import TYPE_CHECKING
15
+
16
+ from .. import util
17
+
18
+ if TYPE_CHECKING:
19
+ from ..engine.interfaces import Dialect
20
+
21
+ __all__ = ("mssql", "mysql", "oracle", "postgresql", "sqlite")
22
+
23
+
24
+ def _auto_fn(name: str) -> Optional[Callable[[], Type[Dialect]]]:
25
+ """default dialect importer.
26
+
27
+ plugs into the :class:`.PluginLoader`
28
+ as a first-hit system.
29
+
30
+ """
31
+ if "." in name:
32
+ dialect, driver = name.split(".")
33
+ else:
34
+ dialect = name
35
+ driver = "base"
36
+
37
+ try:
38
+ if dialect == "mariadb":
39
+ # it's "OK" for us to hardcode here since _auto_fn is already
40
+ # hardcoded. if mysql / mariadb etc were third party dialects
41
+ # they would just publish all the entrypoints, which would actually
42
+ # look much nicer.
43
+ module: Any = __import__(
44
+ "sqlalchemy.dialects.mysql.mariadb"
45
+ ).dialects.mysql.mariadb
46
+ return module.loader(driver) # type: ignore
47
+ else:
48
+ module = __import__("sqlalchemy.dialects.%s" % (dialect,)).dialects
49
+ module = getattr(module, dialect)
50
+ except ImportError:
51
+ return None
52
+
53
+ if hasattr(module, driver):
54
+ module = getattr(module, driver)
55
+ return lambda: module.dialect
56
+ else:
57
+ return None
58
+
59
+
60
+ registry = util.PluginLoader("sqlalchemy.dialects", auto_fn=_auto_fn)
61
+
62
+ plugins = util.PluginLoader("sqlalchemy.plugins")
@@ -0,0 +1,30 @@
1
+ # dialects/_typing.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
+ from typing import Any
10
+ from typing import Iterable
11
+ from typing import Mapping
12
+ from typing import Optional
13
+ from typing import Union
14
+
15
+ from ..sql import roles
16
+ from ..sql.base import ColumnCollection
17
+ from ..sql.schema import Column
18
+ from ..sql.schema import ColumnCollectionConstraint
19
+ from ..sql.schema import Index
20
+
21
+
22
+ _OnConflictConstraintT = Union[str, ColumnCollectionConstraint, Index, None]
23
+ _OnConflictIndexElementsT = Optional[
24
+ Iterable[Union[Column[Any], str, roles.DDLConstraintColumnRole]]
25
+ ]
26
+ _OnConflictIndexWhereT = Optional[roles.WhereHavingRole]
27
+ _OnConflictSetT = Optional[
28
+ Union[Mapping[Any, Any], ColumnCollection[Any, Any]]
29
+ ]
30
+ _OnConflictWhereT = Optional[roles.WhereHavingRole]
@@ -0,0 +1,88 @@
1
+ # dialects/mssql/__init__.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
+ # mypy: ignore-errors
8
+
9
+ from . import aioodbc # noqa
10
+ from . import base # noqa
11
+ from . import pymssql # noqa
12
+ from . import pyodbc # noqa
13
+ from .base import BIGINT
14
+ from .base import BINARY
15
+ from .base import BIT
16
+ from .base import CHAR
17
+ from .base import DATE
18
+ from .base import DATETIME
19
+ from .base import DATETIME2
20
+ from .base import DATETIMEOFFSET
21
+ from .base import DECIMAL
22
+ from .base import DOUBLE_PRECISION
23
+ from .base import FLOAT
24
+ from .base import IMAGE
25
+ from .base import INTEGER
26
+ from .base import JSON
27
+ from .base import MONEY
28
+ from .base import NCHAR
29
+ from .base import NTEXT
30
+ from .base import NUMERIC
31
+ from .base import NVARCHAR
32
+ from .base import REAL
33
+ from .base import ROWVERSION
34
+ from .base import SMALLDATETIME
35
+ from .base import SMALLINT
36
+ from .base import SMALLMONEY
37
+ from .base import SQL_VARIANT
38
+ from .base import TEXT
39
+ from .base import TIME
40
+ from .base import TIMESTAMP
41
+ from .base import TINYINT
42
+ from .base import UNIQUEIDENTIFIER
43
+ from .base import VARBINARY
44
+ from .base import VARCHAR
45
+ from .base import XML
46
+ from ...sql import try_cast
47
+
48
+
49
+ base.dialect = dialect = pyodbc.dialect
50
+
51
+
52
+ __all__ = (
53
+ "JSON",
54
+ "INTEGER",
55
+ "BIGINT",
56
+ "SMALLINT",
57
+ "TINYINT",
58
+ "VARCHAR",
59
+ "NVARCHAR",
60
+ "CHAR",
61
+ "NCHAR",
62
+ "TEXT",
63
+ "NTEXT",
64
+ "DECIMAL",
65
+ "NUMERIC",
66
+ "FLOAT",
67
+ "DATETIME",
68
+ "DATETIME2",
69
+ "DATETIMEOFFSET",
70
+ "DATE",
71
+ "DOUBLE_PRECISION",
72
+ "TIME",
73
+ "SMALLDATETIME",
74
+ "BINARY",
75
+ "VARBINARY",
76
+ "BIT",
77
+ "REAL",
78
+ "IMAGE",
79
+ "TIMESTAMP",
80
+ "ROWVERSION",
81
+ "MONEY",
82
+ "SMALLMONEY",
83
+ "UNIQUEIDENTIFIER",
84
+ "SQL_VARIANT",
85
+ "XML",
86
+ "dialect",
87
+ "try_cast",
88
+ )
@@ -0,0 +1,63 @@
1
+ # dialects/mssql/aioodbc.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
+ # mypy: ignore-errors
8
+ r"""
9
+ .. dialect:: mssql+aioodbc
10
+ :name: aioodbc
11
+ :dbapi: aioodbc
12
+ :connectstring: mssql+aioodbc://<username>:<password>@<dsnname>
13
+ :url: https://pypi.org/project/aioodbc/
14
+
15
+
16
+ Support for the SQL Server database in asyncio style, using the aioodbc
17
+ driver which itself is a thread-wrapper around pyodbc.
18
+
19
+ .. versionadded:: 2.0.23 Added the mssql+aioodbc dialect which builds
20
+ on top of the pyodbc and general aio* dialect architecture.
21
+
22
+ Using a special asyncio mediation layer, the aioodbc dialect is usable
23
+ as the backend for the :ref:`SQLAlchemy asyncio <asyncio_toplevel>`
24
+ extension package.
25
+
26
+ Most behaviors and caveats for this driver are the same as that of the
27
+ pyodbc dialect used on SQL Server; see :ref:`mssql_pyodbc` for general
28
+ background.
29
+
30
+ This dialect should normally be used only with the
31
+ :func:`_asyncio.create_async_engine` engine creation function; connection
32
+ styles are otherwise equivalent to those documented in the pyodbc section::
33
+
34
+ from sqlalchemy.ext.asyncio import create_async_engine
35
+
36
+ engine = create_async_engine(
37
+ "mssql+aioodbc://scott:tiger@mssql2017:1433/test?"
38
+ "driver=ODBC+Driver+18+for+SQL+Server&TrustServerCertificate=yes"
39
+ )
40
+
41
+ """
42
+
43
+ from __future__ import annotations
44
+
45
+ from .pyodbc import MSDialect_pyodbc
46
+ from .pyodbc import MSExecutionContext_pyodbc
47
+ from ...connectors.aioodbc import aiodbcConnector
48
+
49
+
50
+ class MSExecutionContext_aioodbc(MSExecutionContext_pyodbc):
51
+ def create_server_side_cursor(self):
52
+ return self._dbapi_connection.cursor(server_side=True)
53
+
54
+
55
+ class MSDialectAsync_aioodbc(aiodbcConnector, MSDialect_pyodbc):
56
+ driver = "aioodbc"
57
+
58
+ supports_statement_cache = True
59
+
60
+ execution_ctx_cls = MSExecutionContext_aioodbc
61
+
62
+
63
+ dialect = MSDialectAsync_aioodbc