SQLAlchemy 2.0.47__cp313-cp313t-win_amd64.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-win_amd64.pyd +0 -0
  8. sqlalchemy/cyextension/collections.pyx +409 -0
  9. sqlalchemy/cyextension/immutabledict.cp313t-win_amd64.pyd +0 -0
  10. sqlalchemy/cyextension/immutabledict.pxd +8 -0
  11. sqlalchemy/cyextension/immutabledict.pyx +133 -0
  12. sqlalchemy/cyextension/processors.cp313t-win_amd64.pyd +0 -0
  13. sqlalchemy/cyextension/processors.pyx +68 -0
  14. sqlalchemy/cyextension/resultproxy.cp313t-win_amd64.pyd +0 -0
  15. sqlalchemy/cyextension/resultproxy.pyx +102 -0
  16. sqlalchemy/cyextension/util.cp313t-win_amd64.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,375 @@
1
+ # pool/events.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 typing
10
+ from typing import Any
11
+ from typing import Optional
12
+ from typing import Type
13
+ from typing import Union
14
+
15
+ from .base import ConnectionPoolEntry
16
+ from .base import Pool
17
+ from .base import PoolProxiedConnection
18
+ from .base import PoolResetState
19
+ from .. import event
20
+ from .. import util
21
+
22
+ if typing.TYPE_CHECKING:
23
+ from ..engine import Engine
24
+ from ..engine.interfaces import DBAPIConnection
25
+
26
+
27
+ class PoolEvents(event.Events[Pool]):
28
+ """Available events for :class:`_pool.Pool`.
29
+
30
+ The methods here define the name of an event as well
31
+ as the names of members that are passed to listener
32
+ functions.
33
+
34
+ When using an :class:`.Engine` object created via :func:`_sa.create_engine`
35
+ (or indirectly via :func:`.create_async_engine`), :class:`.PoolEvents`
36
+ listeners are expected to be registered in terms of the :class:`.Engine`,
37
+ which will direct the listeners to the :class:`.Pool` contained within::
38
+
39
+ from sqlalchemy import create_engine
40
+ from sqlalchemy import event
41
+
42
+ engine = create_engine("postgresql+psycopg2://scott:tiger@localhost/test")
43
+
44
+
45
+ @event.listens_for(engine, "checkout")
46
+ def my_on_checkout(dbapi_conn, connection_rec, connection_proxy):
47
+ "handle an on checkout event"
48
+
49
+ :class:`.PoolEvents` may also be registered with the :class:`_pool.Pool`
50
+ class, with the :class:`.Engine` class, as well as with instances of
51
+ :class:`_pool.Pool`.
52
+
53
+ .. tip::
54
+
55
+ Registering :class:`.PoolEvents` with the :class:`.Engine`, if present,
56
+ is recommended since the :meth:`.Engine.dispose` method will carry
57
+ along event listeners from the old pool to the new pool.
58
+
59
+ """ # noqa: E501
60
+
61
+ _target_class_doc = "SomeEngineOrPool"
62
+ _dispatch_target = Pool
63
+
64
+ @util.preload_module("sqlalchemy.engine")
65
+ @classmethod
66
+ def _accept_with(
67
+ cls,
68
+ target: Union[Pool, Type[Pool], Engine, Type[Engine]],
69
+ identifier: str,
70
+ ) -> Optional[Union[Pool, Type[Pool]]]:
71
+ if not typing.TYPE_CHECKING:
72
+ Engine = util.preloaded.engine.Engine
73
+
74
+ if isinstance(target, type):
75
+ if issubclass(target, Engine):
76
+ return Pool
77
+ else:
78
+ assert issubclass(target, Pool)
79
+ return target
80
+ elif isinstance(target, Engine):
81
+ return target.pool
82
+ elif isinstance(target, Pool):
83
+ return target
84
+ elif hasattr(target, "_no_async_engine_events"):
85
+ target._no_async_engine_events()
86
+ else:
87
+ return None
88
+
89
+ @classmethod
90
+ def _listen(
91
+ cls,
92
+ event_key: event._EventKey[Pool],
93
+ **kw: Any,
94
+ ) -> None:
95
+ target = event_key.dispatch_target
96
+
97
+ kw.setdefault("asyncio", target._is_asyncio)
98
+
99
+ event_key.base_listen(**kw)
100
+
101
+ def connect(
102
+ self,
103
+ dbapi_connection: DBAPIConnection,
104
+ connection_record: ConnectionPoolEntry,
105
+ ) -> None:
106
+ """Called at the moment a particular DBAPI connection is first
107
+ created for a given :class:`_pool.Pool`.
108
+
109
+ This event allows one to capture the point directly after which
110
+ the DBAPI module-level ``.connect()`` method has been used in order
111
+ to produce a new DBAPI connection.
112
+
113
+ :param dbapi_connection: a DBAPI connection.
114
+ The :attr:`.ConnectionPoolEntry.dbapi_connection` attribute.
115
+
116
+ :param connection_record: the :class:`.ConnectionPoolEntry` managing
117
+ the DBAPI connection.
118
+
119
+ """
120
+
121
+ def first_connect(
122
+ self,
123
+ dbapi_connection: DBAPIConnection,
124
+ connection_record: ConnectionPoolEntry,
125
+ ) -> None:
126
+ """Called exactly once for the first time a DBAPI connection is
127
+ checked out from a particular :class:`_pool.Pool`.
128
+
129
+ The rationale for :meth:`_events.PoolEvents.first_connect`
130
+ is to determine
131
+ information about a particular series of database connections based
132
+ on the settings used for all connections. Since a particular
133
+ :class:`_pool.Pool`
134
+ refers to a single "creator" function (which in terms
135
+ of a :class:`_engine.Engine`
136
+ refers to the URL and connection options used),
137
+ it is typically valid to make observations about a single connection
138
+ that can be safely assumed to be valid about all subsequent
139
+ connections, such as the database version, the server and client
140
+ encoding settings, collation settings, and many others.
141
+
142
+ :param dbapi_connection: a DBAPI connection.
143
+ The :attr:`.ConnectionPoolEntry.dbapi_connection` attribute.
144
+
145
+ :param connection_record: the :class:`.ConnectionPoolEntry` managing
146
+ the DBAPI connection.
147
+
148
+ """
149
+
150
+ def checkout(
151
+ self,
152
+ dbapi_connection: DBAPIConnection,
153
+ connection_record: ConnectionPoolEntry,
154
+ connection_proxy: PoolProxiedConnection,
155
+ ) -> None:
156
+ """Called when a connection is retrieved from the Pool.
157
+
158
+ :param dbapi_connection: a DBAPI connection.
159
+ The :attr:`.ConnectionPoolEntry.dbapi_connection` attribute.
160
+
161
+ :param connection_record: the :class:`.ConnectionPoolEntry` managing
162
+ the DBAPI connection.
163
+
164
+ :param connection_proxy: the :class:`.PoolProxiedConnection` object
165
+ which will proxy the public interface of the DBAPI connection for the
166
+ lifespan of the checkout.
167
+
168
+ If you raise a :class:`~sqlalchemy.exc.DisconnectionError`, the current
169
+ connection will be disposed and a fresh connection retrieved.
170
+ Processing of all checkout listeners will abort and restart
171
+ using the new connection.
172
+
173
+ .. seealso:: :meth:`_events.ConnectionEvents.engine_connect`
174
+ - a similar event
175
+ which occurs upon creation of a new :class:`_engine.Connection`.
176
+
177
+ """
178
+
179
+ def checkin(
180
+ self,
181
+ dbapi_connection: Optional[DBAPIConnection],
182
+ connection_record: ConnectionPoolEntry,
183
+ ) -> None:
184
+ """Called when a connection returns to the pool.
185
+
186
+ Note that the connection may be closed, and may be None if the
187
+ connection has been invalidated. ``checkin`` will not be called
188
+ for detached connections. (They do not return to the pool.)
189
+
190
+ :param dbapi_connection: a DBAPI connection.
191
+ The :attr:`.ConnectionPoolEntry.dbapi_connection` attribute.
192
+
193
+ :param connection_record: the :class:`.ConnectionPoolEntry` managing
194
+ the DBAPI connection.
195
+
196
+ """
197
+
198
+ @event._legacy_signature(
199
+ "2.0",
200
+ ["dbapi_connection", "connection_record"],
201
+ lambda dbapi_connection, connection_record, reset_state: (
202
+ dbapi_connection,
203
+ connection_record,
204
+ ),
205
+ )
206
+ def reset(
207
+ self,
208
+ dbapi_connection: DBAPIConnection,
209
+ connection_record: ConnectionPoolEntry,
210
+ reset_state: PoolResetState,
211
+ ) -> None:
212
+ """Called before the "reset" action occurs for a pooled connection.
213
+
214
+ This event represents
215
+ when the ``rollback()`` method is called on the DBAPI connection
216
+ before it is returned to the pool or discarded.
217
+ A custom "reset" strategy may be implemented using this event hook,
218
+ which may also be combined with disabling the default "reset"
219
+ behavior using the :paramref:`_pool.Pool.reset_on_return` parameter.
220
+
221
+ The primary difference between the :meth:`_events.PoolEvents.reset` and
222
+ :meth:`_events.PoolEvents.checkin` events are that
223
+ :meth:`_events.PoolEvents.reset` is called not just for pooled
224
+ connections that are being returned to the pool, but also for
225
+ connections that were detached using the
226
+ :meth:`_engine.Connection.detach` method as well as asyncio connections
227
+ that are being discarded due to garbage collection taking place on
228
+ connections before the connection was checked in.
229
+
230
+ Note that the event **is not** invoked for connections that were
231
+ invalidated using :meth:`_engine.Connection.invalidate`. These
232
+ events may be intercepted using the :meth:`.PoolEvents.soft_invalidate`
233
+ and :meth:`.PoolEvents.invalidate` event hooks, and all "connection
234
+ close" events may be intercepted using :meth:`.PoolEvents.close`.
235
+
236
+ The :meth:`_events.PoolEvents.reset` event is usually followed by the
237
+ :meth:`_events.PoolEvents.checkin` event, except in those
238
+ cases where the connection is discarded immediately after reset.
239
+
240
+ :param dbapi_connection: a DBAPI connection.
241
+ The :attr:`.ConnectionPoolEntry.dbapi_connection` attribute.
242
+
243
+ :param connection_record: the :class:`.ConnectionPoolEntry` managing
244
+ the DBAPI connection.
245
+
246
+ :param reset_state: :class:`.PoolResetState` instance which provides
247
+ information about the circumstances under which the connection
248
+ is being reset.
249
+
250
+ .. versionadded:: 2.0
251
+
252
+ .. seealso::
253
+
254
+ :ref:`pool_reset_on_return`
255
+
256
+ :meth:`_events.ConnectionEvents.rollback`
257
+
258
+ :meth:`_events.ConnectionEvents.commit`
259
+
260
+ """
261
+
262
+ def invalidate(
263
+ self,
264
+ dbapi_connection: DBAPIConnection,
265
+ connection_record: ConnectionPoolEntry,
266
+ exception: Optional[BaseException],
267
+ ) -> None:
268
+ """Called when a DBAPI connection is to be "invalidated".
269
+
270
+ This event is called any time the
271
+ :meth:`.ConnectionPoolEntry.invalidate` method is invoked, either from
272
+ API usage or via "auto-invalidation", without the ``soft`` flag.
273
+
274
+ The event occurs before a final attempt to call ``.close()`` on the
275
+ connection occurs.
276
+
277
+ :param dbapi_connection: a DBAPI connection.
278
+ The :attr:`.ConnectionPoolEntry.dbapi_connection` attribute.
279
+
280
+ :param connection_record: the :class:`.ConnectionPoolEntry` managing
281
+ the DBAPI connection.
282
+
283
+ :param exception: the exception object corresponding to the reason
284
+ for this invalidation, if any. May be ``None``.
285
+
286
+ .. seealso::
287
+
288
+ :ref:`pool_connection_invalidation`
289
+
290
+ """
291
+
292
+ def soft_invalidate(
293
+ self,
294
+ dbapi_connection: DBAPIConnection,
295
+ connection_record: ConnectionPoolEntry,
296
+ exception: Optional[BaseException],
297
+ ) -> None:
298
+ """Called when a DBAPI connection is to be "soft invalidated".
299
+
300
+ This event is called any time the
301
+ :meth:`.ConnectionPoolEntry.invalidate`
302
+ method is invoked with the ``soft`` flag.
303
+
304
+ Soft invalidation refers to when the connection record that tracks
305
+ this connection will force a reconnect after the current connection
306
+ is checked in. It does not actively close the dbapi_connection
307
+ at the point at which it is called.
308
+
309
+ :param dbapi_connection: a DBAPI connection.
310
+ The :attr:`.ConnectionPoolEntry.dbapi_connection` attribute.
311
+
312
+ :param connection_record: the :class:`.ConnectionPoolEntry` managing
313
+ the DBAPI connection.
314
+
315
+ :param exception: the exception object corresponding to the reason
316
+ for this invalidation, if any. May be ``None``.
317
+
318
+ """
319
+
320
+ def close(
321
+ self,
322
+ dbapi_connection: DBAPIConnection,
323
+ connection_record: ConnectionPoolEntry,
324
+ ) -> None:
325
+ """Called when a DBAPI connection is closed.
326
+
327
+ The event is emitted before the close occurs.
328
+
329
+ The close of a connection can fail; typically this is because
330
+ the connection is already closed. If the close operation fails,
331
+ the connection is discarded.
332
+
333
+ The :meth:`.close` event corresponds to a connection that's still
334
+ associated with the pool. To intercept close events for detached
335
+ connections use :meth:`.close_detached`.
336
+
337
+ :param dbapi_connection: a DBAPI connection.
338
+ The :attr:`.ConnectionPoolEntry.dbapi_connection` attribute.
339
+
340
+ :param connection_record: the :class:`.ConnectionPoolEntry` managing
341
+ the DBAPI connection.
342
+
343
+ """
344
+
345
+ def detach(
346
+ self,
347
+ dbapi_connection: DBAPIConnection,
348
+ connection_record: ConnectionPoolEntry,
349
+ ) -> None:
350
+ """Called when a DBAPI connection is "detached" from a pool.
351
+
352
+ This event is emitted after the detach occurs. The connection
353
+ is no longer associated with the given connection record.
354
+
355
+ :param dbapi_connection: a DBAPI connection.
356
+ The :attr:`.ConnectionPoolEntry.dbapi_connection` attribute.
357
+
358
+ :param connection_record: the :class:`.ConnectionPoolEntry` managing
359
+ the DBAPI connection.
360
+
361
+ """
362
+
363
+ def close_detached(self, dbapi_connection: DBAPIConnection) -> None:
364
+ """Called when a detached DBAPI connection is closed.
365
+
366
+ The event is emitted before the close occurs.
367
+
368
+ The close of a connection can fail; typically this is because
369
+ the connection is already closed. If the close operation fails,
370
+ the connection is discarded.
371
+
372
+ :param dbapi_connection: a DBAPI connection.
373
+ The :attr:`.ConnectionPoolEntry.dbapi_connection` attribute.
374
+
375
+ """