SQLAlchemy 2.1.0rc1__cp315-cp315-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 (276) hide show
  1. sqlalchemy/__init__.py +299 -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 +248 -0
  6. sqlalchemy/dialects/__init__.py +62 -0
  7. sqlalchemy/dialects/_typing.py +29 -0
  8. sqlalchemy/dialects/mssql/__init__.py +88 -0
  9. sqlalchemy/dialects/mssql/aioodbc.py +63 -0
  10. sqlalchemy/dialects/mssql/base.py +4833 -0
  11. sqlalchemy/dialects/mssql/information_schema.py +345 -0
  12. sqlalchemy/dialects/mssql/json.py +140 -0
  13. sqlalchemy/dialects/mssql/mssqlpython.py +242 -0
  14. sqlalchemy/dialects/mssql/provision.py +196 -0
  15. sqlalchemy/dialects/mssql/pymssql.py +130 -0
  16. sqlalchemy/dialects/mssql/pyodbc.py +697 -0
  17. sqlalchemy/dialects/mysql/__init__.py +106 -0
  18. sqlalchemy/dialects/mysql/_mariadb_shim.py +312 -0
  19. sqlalchemy/dialects/mysql/aiomysql.py +260 -0
  20. sqlalchemy/dialects/mysql/asyncmy.py +241 -0
  21. sqlalchemy/dialects/mysql/base.py +3896 -0
  22. sqlalchemy/dialects/mysql/cymysql.py +107 -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 +314 -0
  29. sqlalchemy/dialects/mysql/mysqlconnector.py +291 -0
  30. sqlalchemy/dialects/mysql/mysqldb.py +318 -0
  31. sqlalchemy/dialects/mysql/provision.py +153 -0
  32. sqlalchemy/dialects/mysql/pymysql.py +188 -0
  33. sqlalchemy/dialects/mysql/pyodbc.py +157 -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 +3847 -0
  39. sqlalchemy/dialects/oracle/cx_oracle.py +1736 -0
  40. sqlalchemy/dialects/oracle/dictionary.py +507 -0
  41. sqlalchemy/dialects/oracle/json.py +157 -0
  42. sqlalchemy/dialects/oracle/oracledb.py +898 -0
  43. sqlalchemy/dialects/oracle/provision.py +288 -0
  44. sqlalchemy/dialects/oracle/types.py +367 -0
  45. sqlalchemy/dialects/oracle/vector.py +366 -0
  46. sqlalchemy/dialects/postgresql/__init__.py +170 -0
  47. sqlalchemy/dialects/postgresql/_psycopg_common.py +232 -0
  48. sqlalchemy/dialects/postgresql/array.py +534 -0
  49. sqlalchemy/dialects/postgresql/asyncpg.py +1318 -0
  50. sqlalchemy/dialects/postgresql/base.py +5935 -0
  51. sqlalchemy/dialects/postgresql/bitstring.py +327 -0
  52. sqlalchemy/dialects/postgresql/dml.py +360 -0
  53. sqlalchemy/dialects/postgresql/ext.py +599 -0
  54. sqlalchemy/dialects/postgresql/hstore.py +422 -0
  55. sqlalchemy/dialects/postgresql/json.py +411 -0
  56. sqlalchemy/dialects/postgresql/named_types.py +535 -0
  57. sqlalchemy/dialects/postgresql/operators.py +129 -0
  58. sqlalchemy/dialects/postgresql/pg8000.py +655 -0
  59. sqlalchemy/dialects/postgresql/pg_catalog.py +345 -0
  60. sqlalchemy/dialects/postgresql/provision.py +202 -0
  61. sqlalchemy/dialects/postgresql/psycopg.py +800 -0
  62. sqlalchemy/dialects/postgresql/psycopg2.py +860 -0
  63. sqlalchemy/dialects/postgresql/psycopg2cffi.py +62 -0
  64. sqlalchemy/dialects/postgresql/ranges.py +1002 -0
  65. sqlalchemy/dialects/postgresql/types.py +388 -0
  66. sqlalchemy/dialects/sqlite/__init__.py +59 -0
  67. sqlalchemy/dialects/sqlite/aiosqlite.py +375 -0
  68. sqlalchemy/dialects/sqlite/base.py +3103 -0
  69. sqlalchemy/dialects/sqlite/dml.py +314 -0
  70. sqlalchemy/dialects/sqlite/json.py +134 -0
  71. sqlalchemy/dialects/sqlite/provision.py +237 -0
  72. sqlalchemy/dialects/sqlite/pysqlcipher.py +166 -0
  73. sqlalchemy/dialects/sqlite/pysqlite.py +959 -0
  74. sqlalchemy/dialects/type_migration_guidelines.txt +145 -0
  75. sqlalchemy/engine/__init__.py +62 -0
  76. sqlalchemy/engine/_processors_cy.cp315-win_arm64.pyd +0 -0
  77. sqlalchemy/engine/_processors_cy.py +92 -0
  78. sqlalchemy/engine/_result_cy.cp315-win_arm64.pyd +0 -0
  79. sqlalchemy/engine/_result_cy.py +711 -0
  80. sqlalchemy/engine/_row_cy.cp315-win_arm64.pyd +0 -0
  81. sqlalchemy/engine/_row_cy.py +232 -0
  82. sqlalchemy/engine/_util_cy.cp315-win_arm64.pyd +0 -0
  83. sqlalchemy/engine/_util_cy.py +136 -0
  84. sqlalchemy/engine/base.py +3357 -0
  85. sqlalchemy/engine/characteristics.py +155 -0
  86. sqlalchemy/engine/create.py +877 -0
  87. sqlalchemy/engine/cursor.py +2425 -0
  88. sqlalchemy/engine/default.py +2627 -0
  89. sqlalchemy/engine/events.py +965 -0
  90. sqlalchemy/engine/interfaces.py +3636 -0
  91. sqlalchemy/engine/mock.py +133 -0
  92. sqlalchemy/engine/processors.py +83 -0
  93. sqlalchemy/engine/reflection.py +2141 -0
  94. sqlalchemy/engine/result.py +2012 -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 +164 -0
  99. sqlalchemy/event/__init__.py +26 -0
  100. sqlalchemy/event/api.py +220 -0
  101. sqlalchemy/event/attr.py +675 -0
  102. sqlalchemy/event/base.py +473 -0
  103. sqlalchemy/event/legacy.py +259 -0
  104. sqlalchemy/event/registry.py +391 -0
  105. sqlalchemy/events.py +17 -0
  106. sqlalchemy/exc.py +939 -0
  107. sqlalchemy/ext/__init__.py +10 -0
  108. sqlalchemy/ext/associationproxy.py +2073 -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 +2006 -0
  116. sqlalchemy/ext/automap.py +1702 -0
  117. sqlalchemy/ext/baked.py +558 -0
  118. sqlalchemy/ext/compiler.py +601 -0
  119. sqlalchemy/ext/declarative/__init__.py +65 -0
  120. sqlalchemy/ext/declarative/extensions.py +561 -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 +440 -0
  127. sqlalchemy/ext/serializer.py +184 -0
  128. sqlalchemy/future/__init__.py +17 -0
  129. sqlalchemy/future/engine.py +15 -0
  130. sqlalchemy/inspection.py +188 -0
  131. sqlalchemy/log.py +279 -0
  132. sqlalchemy/orm/__init__.py +176 -0
  133. sqlalchemy/orm/_orm_constructors.py +2694 -0
  134. sqlalchemy/orm/_typing.py +180 -0
  135. sqlalchemy/orm/attributes.py +2868 -0
  136. sqlalchemy/orm/base.py +991 -0
  137. sqlalchemy/orm/bulk_persistence.py +2168 -0
  138. sqlalchemy/orm/clsregistry.py +630 -0
  139. sqlalchemy/orm/collections.py +1569 -0
  140. sqlalchemy/orm/context.py +3475 -0
  141. sqlalchemy/orm/decl_api.py +2283 -0
  142. sqlalchemy/orm/decl_base.py +2320 -0
  143. sqlalchemy/orm/dependency.py +1306 -0
  144. sqlalchemy/orm/descriptor_props.py +1183 -0
  145. sqlalchemy/orm/dynamic.py +306 -0
  146. sqlalchemy/orm/evaluator.py +378 -0
  147. sqlalchemy/orm/events.py +3387 -0
  148. sqlalchemy/orm/exc.py +237 -0
  149. sqlalchemy/orm/identity.py +302 -0
  150. sqlalchemy/orm/instrumentation.py +749 -0
  151. sqlalchemy/orm/interfaces.py +1595 -0
  152. sqlalchemy/orm/loading.py +1712 -0
  153. sqlalchemy/orm/mapped_collection.py +557 -0
  154. sqlalchemy/orm/mapper.py +4465 -0
  155. sqlalchemy/orm/path_registry.py +907 -0
  156. sqlalchemy/orm/persistence.py +1790 -0
  157. sqlalchemy/orm/properties.py +972 -0
  158. sqlalchemy/orm/query.py +3528 -0
  159. sqlalchemy/orm/relationships.py +3608 -0
  160. sqlalchemy/orm/scoping.py +2233 -0
  161. sqlalchemy/orm/session.py +5468 -0
  162. sqlalchemy/orm/state.py +1175 -0
  163. sqlalchemy/orm/state_changes.py +196 -0
  164. sqlalchemy/orm/strategies.py +3552 -0
  165. sqlalchemy/orm/strategy_options.py +2648 -0
  166. sqlalchemy/orm/sync.py +164 -0
  167. sqlalchemy/orm/unitofwork.py +797 -0
  168. sqlalchemy/orm/util.py +2461 -0
  169. sqlalchemy/orm/writeonly.py +701 -0
  170. sqlalchemy/pool/__init__.py +41 -0
  171. sqlalchemy/pool/base.py +1540 -0
  172. sqlalchemy/pool/events.py +375 -0
  173. sqlalchemy/pool/impl.py +583 -0
  174. sqlalchemy/py.typed +0 -0
  175. sqlalchemy/schema.py +75 -0
  176. sqlalchemy/sql/__init__.py +156 -0
  177. sqlalchemy/sql/_annotated_cols.py +402 -0
  178. sqlalchemy/sql/_cache_key_cy.cp315-win_arm64.pyd +0 -0
  179. sqlalchemy/sql/_cache_key_cy.py +363 -0
  180. sqlalchemy/sql/_dml_constructors.py +132 -0
  181. sqlalchemy/sql/_elements_constructors.py +2190 -0
  182. sqlalchemy/sql/_orm_types.py +19 -0
  183. sqlalchemy/sql/_selectable_constructors.py +840 -0
  184. sqlalchemy/sql/_typing.py +500 -0
  185. sqlalchemy/sql/_util_cy.cp315-win_arm64.pyd +0 -0
  186. sqlalchemy/sql/_util_cy.pxd +11 -0
  187. sqlalchemy/sql/_util_cy.py +127 -0
  188. sqlalchemy/sql/annotation.py +590 -0
  189. sqlalchemy/sql/base.py +2702 -0
  190. sqlalchemy/sql/cache_key.py +915 -0
  191. sqlalchemy/sql/coercions.py +1373 -0
  192. sqlalchemy/sql/compiler.py +8453 -0
  193. sqlalchemy/sql/crud.py +1816 -0
  194. sqlalchemy/sql/ddl.py +1962 -0
  195. sqlalchemy/sql/default_comparator.py +660 -0
  196. sqlalchemy/sql/dml.py +2018 -0
  197. sqlalchemy/sql/elements.py +6057 -0
  198. sqlalchemy/sql/events.py +458 -0
  199. sqlalchemy/sql/expression.py +171 -0
  200. sqlalchemy/sql/functions.py +2380 -0
  201. sqlalchemy/sql/lambdas.py +1442 -0
  202. sqlalchemy/sql/naming.py +204 -0
  203. sqlalchemy/sql/operators.py +2909 -0
  204. sqlalchemy/sql/roles.py +332 -0
  205. sqlalchemy/sql/schema.py +7075 -0
  206. sqlalchemy/sql/selectable.py +7634 -0
  207. sqlalchemy/sql/sqltypes.py +4130 -0
  208. sqlalchemy/sql/traversals.py +1041 -0
  209. sqlalchemy/sql/type_api.py +2450 -0
  210. sqlalchemy/sql/util.py +1496 -0
  211. sqlalchemy/sql/visitors.py +1153 -0
  212. sqlalchemy/testing/__init__.py +97 -0
  213. sqlalchemy/testing/assertions.py +1007 -0
  214. sqlalchemy/testing/assertsql.py +519 -0
  215. sqlalchemy/testing/asyncio.py +128 -0
  216. sqlalchemy/testing/cancellation.py +237 -0
  217. sqlalchemy/testing/config.py +440 -0
  218. sqlalchemy/testing/engines.py +482 -0
  219. sqlalchemy/testing/entities.py +117 -0
  220. sqlalchemy/testing/exclusions.py +501 -0
  221. sqlalchemy/testing/fixtures/__init__.py +30 -0
  222. sqlalchemy/testing/fixtures/base.py +426 -0
  223. sqlalchemy/testing/fixtures/mypy.py +247 -0
  224. sqlalchemy/testing/fixtures/orm.py +227 -0
  225. sqlalchemy/testing/fixtures/sql.py +538 -0
  226. sqlalchemy/testing/pickleable.py +155 -0
  227. sqlalchemy/testing/plugin/__init__.py +6 -0
  228. sqlalchemy/testing/plugin/bootstrap.py +50 -0
  229. sqlalchemy/testing/plugin/plugin_base.py +828 -0
  230. sqlalchemy/testing/plugin/pytestplugin.py +896 -0
  231. sqlalchemy/testing/profiles_file.py +350 -0
  232. sqlalchemy/testing/profiling.py +294 -0
  233. sqlalchemy/testing/provision.py +633 -0
  234. sqlalchemy/testing/requirements.py +1971 -0
  235. sqlalchemy/testing/schema.py +198 -0
  236. sqlalchemy/testing/suite/__init__.py +19 -0
  237. sqlalchemy/testing/suite/test_cte.py +237 -0
  238. sqlalchemy/testing/suite/test_ddl.py +420 -0
  239. sqlalchemy/testing/suite/test_dialect.py +776 -0
  240. sqlalchemy/testing/suite/test_insert.py +630 -0
  241. sqlalchemy/testing/suite/test_reflection.py +3815 -0
  242. sqlalchemy/testing/suite/test_results.py +660 -0
  243. sqlalchemy/testing/suite/test_rowcount.py +258 -0
  244. sqlalchemy/testing/suite/test_select.py +2112 -0
  245. sqlalchemy/testing/suite/test_sequence.py +317 -0
  246. sqlalchemy/testing/suite/test_table_via_select.py +686 -0
  247. sqlalchemy/testing/suite/test_types.py +2271 -0
  248. sqlalchemy/testing/suite/test_unicode_ddl.py +189 -0
  249. sqlalchemy/testing/suite/test_update_delete.py +139 -0
  250. sqlalchemy/testing/util.py +575 -0
  251. sqlalchemy/testing/warnings.py +52 -0
  252. sqlalchemy/types.py +75 -0
  253. sqlalchemy/util/__init__.py +165 -0
  254. sqlalchemy/util/_collections.py +688 -0
  255. sqlalchemy/util/_collections_cy.cp315-win_arm64.pyd +0 -0
  256. sqlalchemy/util/_collections_cy.pxd +8 -0
  257. sqlalchemy/util/_collections_cy.py +516 -0
  258. sqlalchemy/util/_has_cython.py +48 -0
  259. sqlalchemy/util/_immutabledict_cy.cp315-win_arm64.pyd +0 -0
  260. sqlalchemy/util/_immutabledict_cy.py +240 -0
  261. sqlalchemy/util/compat.py +298 -0
  262. sqlalchemy/util/concurrency.py +272 -0
  263. sqlalchemy/util/cython.py +95 -0
  264. sqlalchemy/util/deprecations.py +401 -0
  265. sqlalchemy/util/langhelpers.py +2797 -0
  266. sqlalchemy/util/preloaded.py +153 -0
  267. sqlalchemy/util/queue.py +304 -0
  268. sqlalchemy/util/tool_support.py +202 -0
  269. sqlalchemy/util/topological.py +120 -0
  270. sqlalchemy/util/typing.py +709 -0
  271. sqlalchemy-2.1.0rc1.dist-info/METADATA +270 -0
  272. sqlalchemy-2.1.0rc1.dist-info/RECORD +276 -0
  273. sqlalchemy-2.1.0rc1.dist-info/WHEEL +5 -0
  274. sqlalchemy-2.1.0rc1.dist-info/licenses/AUTHORS +30 -0
  275. sqlalchemy-2.1.0rc1.dist-info/licenses/LICENSE +19 -0
  276. sqlalchemy-2.1.0rc1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,241 @@
1
+ # dialects/mysql/asyncmy.py
2
+ # Copyright (C) 2005-2026 the SQLAlchemy authors and contributors <see AUTHORS
3
+ # 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
+ r"""
9
+ .. dialect:: mysql+asyncmy
10
+ :name: asyncmy
11
+ :dbapi: asyncmy
12
+ :connectstring: mysql+asyncmy://user:password@host:port/dbname[?key=value&key=value...]
13
+ :url: https://github.com/long2ice/asyncmy
14
+
15
+ Using a special asyncio mediation layer, the asyncmy dialect is usable
16
+ as the backend for the :ref:`SQLAlchemy asyncio <asyncio_toplevel>`
17
+ extension package.
18
+
19
+ This dialect should normally be used only with the
20
+ :func:`_asyncio.create_async_engine` engine creation function::
21
+
22
+ from sqlalchemy.ext.asyncio import create_async_engine
23
+
24
+ engine = create_async_engine(
25
+ "mysql+asyncmy://user:pass@hostname/dbname?charset=utf8mb4"
26
+ )
27
+
28
+ """ # noqa
29
+
30
+ from __future__ import annotations
31
+
32
+ from types import ModuleType
33
+ from typing import Any
34
+ from typing import NoReturn
35
+ from typing import Optional
36
+ from typing import TYPE_CHECKING
37
+ from typing import Union
38
+
39
+ from .pymysql import _connection_ping_reconnects_true
40
+ from .pymysql import MySQLDialect_pymysql
41
+ from ... import util
42
+ from ...connectors.asyncio import AsyncAdapt_dbapi_connection
43
+ from ...connectors.asyncio import AsyncAdapt_dbapi_cursor
44
+ from ...connectors.asyncio import AsyncAdapt_dbapi_module
45
+ from ...connectors.asyncio import AsyncAdapt_dbapi_ss_cursor
46
+ from ...connectors.asyncio import AsyncAdapt_terminate
47
+ from ...util import langhelpers
48
+ from ...util.concurrency import await_
49
+
50
+ if TYPE_CHECKING:
51
+
52
+ from ...connectors.asyncio import AsyncIODBAPIConnection
53
+ from ...connectors.asyncio import AsyncIODBAPICursor
54
+ from ...engine.interfaces import ConnectArgsType
55
+ from ...engine.interfaces import DBAPIConnection
56
+ from ...engine.interfaces import DBAPICursor
57
+ from ...engine.interfaces import DBAPIModule
58
+ from ...engine.interfaces import PoolProxiedConnection
59
+ from ...engine.url import URL
60
+
61
+
62
+ class AsyncAdapt_asyncmy_cursor(AsyncAdapt_dbapi_cursor):
63
+ __slots__ = ()
64
+
65
+
66
+ class AsyncAdapt_asyncmy_ss_cursor(
67
+ AsyncAdapt_dbapi_ss_cursor, AsyncAdapt_asyncmy_cursor
68
+ ):
69
+ __slots__ = ()
70
+
71
+ def _make_new_cursor(
72
+ self, connection: AsyncIODBAPIConnection
73
+ ) -> AsyncIODBAPICursor:
74
+ return connection.cursor(
75
+ self._adapt_connection.dbapi.asyncmy.cursors.SSCursor
76
+ )
77
+
78
+
79
+ class AsyncAdapt_asyncmy_connection(
80
+ AsyncAdapt_terminate, AsyncAdapt_dbapi_connection
81
+ ):
82
+ __slots__ = ()
83
+
84
+ _cursor_cls = AsyncAdapt_asyncmy_cursor
85
+ _ss_cursor_cls = AsyncAdapt_asyncmy_ss_cursor
86
+
87
+ @classmethod
88
+ def _handle_exception_no_connection(
89
+ cls, dbapi: Any, error: Exception
90
+ ) -> NoReturn:
91
+ if isinstance(error, AttributeError):
92
+ raise dbapi.InternalError(
93
+ "network operation failed due to asyncmy attribute error"
94
+ ) from error
95
+
96
+ raise error
97
+
98
+ def ping(self, reconnect: bool = False) -> None:
99
+ assert not reconnect
100
+ return await_(self._do_ping())
101
+
102
+ async def _do_ping(self) -> None:
103
+ try:
104
+ async with self._execute_mutex:
105
+ if self.dbapi._send_false_to_ping:
106
+ await self._connection.ping(reconnect=False)
107
+ else:
108
+ await self._connection.ping()
109
+ except Exception as error:
110
+ self._handle_exception(error)
111
+
112
+ def character_set_name(self) -> Optional[str]:
113
+ return self._connection.character_set_name() # type: ignore[no-any-return] # noqa: E501
114
+
115
+ def autocommit(self, value: Any) -> None:
116
+ await_(self._connection.autocommit(value))
117
+
118
+ def get_autocommit(self) -> bool:
119
+ return self._connection.get_autocommit() # type: ignore[no-any-return]
120
+
121
+ def close(self) -> None:
122
+ await_(self._connection.ensure_closed())
123
+
124
+ async def _terminate_graceful_close(self) -> None:
125
+ await self._connection.ensure_closed()
126
+
127
+ def _terminate_force_close(self) -> None:
128
+ # it's not awaitable.
129
+ self._connection.close()
130
+
131
+
132
+ class AsyncAdapt_asyncmy_dbapi(AsyncAdapt_dbapi_module):
133
+ def __init__(self, asyncmy: ModuleType):
134
+ super().__init__(asyncmy)
135
+ self.asyncmy = asyncmy
136
+ self.paramstyle = "format"
137
+ self._init_dbapi_attributes()
138
+
139
+ def _init_dbapi_attributes(self) -> None:
140
+ for name in (
141
+ "Warning",
142
+ "Error",
143
+ "InterfaceError",
144
+ "DataError",
145
+ "DatabaseError",
146
+ "OperationalError",
147
+ "InterfaceError",
148
+ "IntegrityError",
149
+ "ProgrammingError",
150
+ "InternalError",
151
+ "NotSupportedError",
152
+ ):
153
+ setattr(self, name, getattr(self.asyncmy.errors, name))
154
+
155
+ STRING = util.symbol("STRING")
156
+ NUMBER = util.symbol("NUMBER")
157
+ BINARY = util.symbol("BINARY")
158
+ DATETIME = util.symbol("DATETIME")
159
+ TIMESTAMP = util.symbol("TIMESTAMP")
160
+ Binary = staticmethod(bytes)
161
+
162
+ def connect(self, *arg: Any, **kw: Any) -> AsyncAdapt_asyncmy_connection:
163
+ creator_fn = kw.pop("async_creator_fn", self.asyncmy.connect)
164
+
165
+ return await_(
166
+ AsyncAdapt_asyncmy_connection.create(
167
+ self,
168
+ creator_fn(*arg, **kw),
169
+ )
170
+ )
171
+
172
+ @langhelpers.memoized_property
173
+ def _send_false_to_ping(self) -> bool:
174
+ """determine if asyncmy has deprecated, changed the default of,
175
+ or removed the 'reconnect' argument of connection.ping().
176
+
177
+ See #13306 and #10492
178
+
179
+ """ # noqa: E501
180
+
181
+ try:
182
+ Connection = __import__("asyncmy.connection").connection.Connection
183
+ except (ImportError, AttributeError):
184
+ return True
185
+ else:
186
+ return _connection_ping_reconnects_true(Connection)
187
+
188
+
189
+ class MySQLDialect_asyncmy(MySQLDialect_pymysql):
190
+ driver = "asyncmy"
191
+ supports_statement_cache = True
192
+
193
+ supports_server_side_cursors = True
194
+ _sscursor = AsyncAdapt_asyncmy_ss_cursor
195
+
196
+ is_async = True
197
+ has_terminate = True
198
+
199
+ @classmethod
200
+ def import_dbapi(cls) -> DBAPIModule:
201
+ return AsyncAdapt_asyncmy_dbapi(__import__("asyncmy"))
202
+
203
+ def retrieve_dbapi_version(self, dbapi: DBAPIModule) -> util.VersionInfo:
204
+ # asyncmy publishes no version of its own within the module, so
205
+ # the installed distribution is consulted
206
+ return util.parse_version_from_metadata("asyncmy")
207
+
208
+ def do_terminate(self, dbapi_connection: DBAPIConnection) -> None:
209
+ dbapi_connection.terminate()
210
+
211
+ def create_connect_args(self, url: URL) -> ConnectArgsType: # type: ignore[override] # noqa: E501
212
+ return super().create_connect_args(
213
+ url, _translate_args=dict(username="user", database="db")
214
+ )
215
+
216
+ def is_disconnect(
217
+ self,
218
+ e: DBAPIModule.Error,
219
+ connection: Optional[Union[PoolProxiedConnection, DBAPIConnection]],
220
+ cursor: Optional[DBAPICursor],
221
+ ) -> bool:
222
+ if super().is_disconnect(e, connection, cursor):
223
+ return True
224
+ else:
225
+ str_e = str(e).lower()
226
+ return (
227
+ "not connected" in str_e or "network operation failed" in str_e
228
+ )
229
+
230
+ def _found_rows_client_flag(self) -> int:
231
+ from asyncmy.constants import CLIENT # type: ignore[import-not-found]
232
+
233
+ return CLIENT.FOUND_ROWS # type: ignore[no-any-return]
234
+
235
+ def get_driver_connection(
236
+ self, connection: DBAPIConnection
237
+ ) -> AsyncIODBAPIConnection:
238
+ return connection._connection # type: ignore[no-any-return]
239
+
240
+
241
+ dialect = MySQLDialect_asyncmy