SQLAlchemy 2.0.36__cp313-cp313-win32.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (273) hide show
  1. SQLAlchemy-2.0.36.dist-info/LICENSE +19 -0
  2. SQLAlchemy-2.0.36.dist-info/METADATA +243 -0
  3. SQLAlchemy-2.0.36.dist-info/RECORD +273 -0
  4. SQLAlchemy-2.0.36.dist-info/WHEEL +5 -0
  5. SQLAlchemy-2.0.36.dist-info/top_level.txt +1 -0
  6. sqlalchemy/__init__.py +294 -0
  7. sqlalchemy/connectors/__init__.py +18 -0
  8. sqlalchemy/connectors/aioodbc.py +174 -0
  9. sqlalchemy/connectors/asyncio.py +213 -0
  10. sqlalchemy/connectors/pyodbc.py +249 -0
  11. sqlalchemy/cyextension/__init__.py +6 -0
  12. sqlalchemy/cyextension/collections.cp313-win32.pyd +0 -0
  13. sqlalchemy/cyextension/collections.pyx +409 -0
  14. sqlalchemy/cyextension/immutabledict.cp313-win32.pyd +0 -0
  15. sqlalchemy/cyextension/immutabledict.pxd +8 -0
  16. sqlalchemy/cyextension/immutabledict.pyx +133 -0
  17. sqlalchemy/cyextension/processors.cp313-win32.pyd +0 -0
  18. sqlalchemy/cyextension/processors.pyx +68 -0
  19. sqlalchemy/cyextension/resultproxy.cp313-win32.pyd +0 -0
  20. sqlalchemy/cyextension/resultproxy.pyx +102 -0
  21. sqlalchemy/cyextension/util.cp313-win32.pyd +0 -0
  22. sqlalchemy/cyextension/util.pyx +91 -0
  23. sqlalchemy/dialects/__init__.py +61 -0
  24. sqlalchemy/dialects/_typing.py +25 -0
  25. sqlalchemy/dialects/mssql/__init__.py +88 -0
  26. sqlalchemy/dialects/mssql/aioodbc.py +64 -0
  27. sqlalchemy/dialects/mssql/base.py +4010 -0
  28. sqlalchemy/dialects/mssql/information_schema.py +254 -0
  29. sqlalchemy/dialects/mssql/json.py +133 -0
  30. sqlalchemy/dialects/mssql/provision.py +162 -0
  31. sqlalchemy/dialects/mssql/pymssql.py +126 -0
  32. sqlalchemy/dialects/mssql/pyodbc.py +745 -0
  33. sqlalchemy/dialects/mysql/__init__.py +101 -0
  34. sqlalchemy/dialects/mysql/aiomysql.py +333 -0
  35. sqlalchemy/dialects/mysql/asyncmy.py +337 -0
  36. sqlalchemy/dialects/mysql/base.py +3494 -0
  37. sqlalchemy/dialects/mysql/cymysql.py +84 -0
  38. sqlalchemy/dialects/mysql/dml.py +219 -0
  39. sqlalchemy/dialects/mysql/enumerated.py +244 -0
  40. sqlalchemy/dialects/mysql/expression.py +141 -0
  41. sqlalchemy/dialects/mysql/json.py +81 -0
  42. sqlalchemy/dialects/mysql/mariadb.py +32 -0
  43. sqlalchemy/dialects/mysql/mariadbconnector.py +277 -0
  44. sqlalchemy/dialects/mysql/mysqlconnector.py +180 -0
  45. sqlalchemy/dialects/mysql/mysqldb.py +303 -0
  46. sqlalchemy/dialects/mysql/provision.py +110 -0
  47. sqlalchemy/dialects/mysql/pymysql.py +137 -0
  48. sqlalchemy/dialects/mysql/pyodbc.py +138 -0
  49. sqlalchemy/dialects/mysql/reflection.py +677 -0
  50. sqlalchemy/dialects/mysql/reserved_words.py +571 -0
  51. sqlalchemy/dialects/mysql/types.py +774 -0
  52. sqlalchemy/dialects/oracle/__init__.py +67 -0
  53. sqlalchemy/dialects/oracle/base.py +3271 -0
  54. sqlalchemy/dialects/oracle/cx_oracle.py +1483 -0
  55. sqlalchemy/dialects/oracle/dictionary.py +507 -0
  56. sqlalchemy/dialects/oracle/oracledb.py +431 -0
  57. sqlalchemy/dialects/oracle/provision.py +220 -0
  58. sqlalchemy/dialects/oracle/types.py +287 -0
  59. sqlalchemy/dialects/postgresql/__init__.py +167 -0
  60. sqlalchemy/dialects/postgresql/_psycopg_common.py +187 -0
  61. sqlalchemy/dialects/postgresql/array.py +425 -0
  62. sqlalchemy/dialects/postgresql/asyncpg.py +1274 -0
  63. sqlalchemy/dialects/postgresql/base.py +5008 -0
  64. sqlalchemy/dialects/postgresql/dml.py +310 -0
  65. sqlalchemy/dialects/postgresql/ext.py +496 -0
  66. sqlalchemy/dialects/postgresql/hstore.py +397 -0
  67. sqlalchemy/dialects/postgresql/json.py +333 -0
  68. sqlalchemy/dialects/postgresql/named_types.py +509 -0
  69. sqlalchemy/dialects/postgresql/operators.py +129 -0
  70. sqlalchemy/dialects/postgresql/pg8000.py +662 -0
  71. sqlalchemy/dialects/postgresql/pg_catalog.py +300 -0
  72. sqlalchemy/dialects/postgresql/provision.py +175 -0
  73. sqlalchemy/dialects/postgresql/psycopg.py +772 -0
  74. sqlalchemy/dialects/postgresql/psycopg2.py +886 -0
  75. sqlalchemy/dialects/postgresql/psycopg2cffi.py +61 -0
  76. sqlalchemy/dialects/postgresql/ranges.py +1029 -0
  77. sqlalchemy/dialects/postgresql/types.py +303 -0
  78. sqlalchemy/dialects/sqlite/__init__.py +57 -0
  79. sqlalchemy/dialects/sqlite/aiosqlite.py +396 -0
  80. sqlalchemy/dialects/sqlite/base.py +2805 -0
  81. sqlalchemy/dialects/sqlite/dml.py +240 -0
  82. sqlalchemy/dialects/sqlite/json.py +92 -0
  83. sqlalchemy/dialects/sqlite/provision.py +198 -0
  84. sqlalchemy/dialects/sqlite/pysqlcipher.py +155 -0
  85. sqlalchemy/dialects/sqlite/pysqlite.py +756 -0
  86. sqlalchemy/dialects/type_migration_guidelines.txt +145 -0
  87. sqlalchemy/engine/__init__.py +62 -0
  88. sqlalchemy/engine/_py_processors.py +136 -0
  89. sqlalchemy/engine/_py_row.py +128 -0
  90. sqlalchemy/engine/_py_util.py +74 -0
  91. sqlalchemy/engine/base.py +3375 -0
  92. sqlalchemy/engine/characteristics.py +155 -0
  93. sqlalchemy/engine/create.py +875 -0
  94. sqlalchemy/engine/cursor.py +2181 -0
  95. sqlalchemy/engine/default.py +2365 -0
  96. sqlalchemy/engine/events.py +951 -0
  97. sqlalchemy/engine/interfaces.py +3403 -0
  98. sqlalchemy/engine/mock.py +131 -0
  99. sqlalchemy/engine/processors.py +61 -0
  100. sqlalchemy/engine/reflection.py +2098 -0
  101. sqlalchemy/engine/result.py +2382 -0
  102. sqlalchemy/engine/row.py +401 -0
  103. sqlalchemy/engine/strategies.py +19 -0
  104. sqlalchemy/engine/url.py +910 -0
  105. sqlalchemy/engine/util.py +167 -0
  106. sqlalchemy/event/__init__.py +25 -0
  107. sqlalchemy/event/api.py +225 -0
  108. sqlalchemy/event/attr.py +655 -0
  109. sqlalchemy/event/base.py +470 -0
  110. sqlalchemy/event/legacy.py +246 -0
  111. sqlalchemy/event/registry.py +386 -0
  112. sqlalchemy/events.py +17 -0
  113. sqlalchemy/exc.py +830 -0
  114. sqlalchemy/ext/__init__.py +11 -0
  115. sqlalchemy/ext/associationproxy.py +2013 -0
  116. sqlalchemy/ext/asyncio/__init__.py +25 -0
  117. sqlalchemy/ext/asyncio/base.py +279 -0
  118. sqlalchemy/ext/asyncio/engine.py +1466 -0
  119. sqlalchemy/ext/asyncio/exc.py +21 -0
  120. sqlalchemy/ext/asyncio/result.py +961 -0
  121. sqlalchemy/ext/asyncio/scoping.py +1614 -0
  122. sqlalchemy/ext/asyncio/session.py +1936 -0
  123. sqlalchemy/ext/automap.py +1691 -0
  124. sqlalchemy/ext/baked.py +574 -0
  125. sqlalchemy/ext/compiler.py +570 -0
  126. sqlalchemy/ext/declarative/__init__.py +65 -0
  127. sqlalchemy/ext/declarative/extensions.py +548 -0
  128. sqlalchemy/ext/horizontal_shard.py +481 -0
  129. sqlalchemy/ext/hybrid.py +1514 -0
  130. sqlalchemy/ext/indexable.py +341 -0
  131. sqlalchemy/ext/instrumentation.py +450 -0
  132. sqlalchemy/ext/mutable.py +1073 -0
  133. sqlalchemy/ext/mypy/__init__.py +6 -0
  134. sqlalchemy/ext/mypy/apply.py +320 -0
  135. sqlalchemy/ext/mypy/decl_class.py +515 -0
  136. sqlalchemy/ext/mypy/infer.py +590 -0
  137. sqlalchemy/ext/mypy/names.py +335 -0
  138. sqlalchemy/ext/mypy/plugin.py +303 -0
  139. sqlalchemy/ext/mypy/util.py +357 -0
  140. sqlalchemy/ext/orderinglist.py +416 -0
  141. sqlalchemy/ext/serializer.py +181 -0
  142. sqlalchemy/future/__init__.py +16 -0
  143. sqlalchemy/future/engine.py +15 -0
  144. sqlalchemy/inspection.py +174 -0
  145. sqlalchemy/log.py +288 -0
  146. sqlalchemy/orm/__init__.py +170 -0
  147. sqlalchemy/orm/_orm_constructors.py +2571 -0
  148. sqlalchemy/orm/_typing.py +179 -0
  149. sqlalchemy/orm/attributes.py +2835 -0
  150. sqlalchemy/orm/base.py +973 -0
  151. sqlalchemy/orm/bulk_persistence.py +2123 -0
  152. sqlalchemy/orm/clsregistry.py +571 -0
  153. sqlalchemy/orm/collections.py +1620 -0
  154. sqlalchemy/orm/context.py +3268 -0
  155. sqlalchemy/orm/decl_api.py +1883 -0
  156. sqlalchemy/orm/decl_base.py +2190 -0
  157. sqlalchemy/orm/dependency.py +1304 -0
  158. sqlalchemy/orm/descriptor_props.py +1076 -0
  159. sqlalchemy/orm/dynamic.py +300 -0
  160. sqlalchemy/orm/evaluator.py +379 -0
  161. sqlalchemy/orm/events.py +3261 -0
  162. sqlalchemy/orm/exc.py +228 -0
  163. sqlalchemy/orm/identity.py +302 -0
  164. sqlalchemy/orm/instrumentation.py +754 -0
  165. sqlalchemy/orm/interfaces.py +1474 -0
  166. sqlalchemy/orm/loading.py +1682 -0
  167. sqlalchemy/orm/mapped_collection.py +557 -0
  168. sqlalchemy/orm/mapper.py +4432 -0
  169. sqlalchemy/orm/path_registry.py +811 -0
  170. sqlalchemy/orm/persistence.py +1782 -0
  171. sqlalchemy/orm/properties.py +886 -0
  172. sqlalchemy/orm/query.py +3396 -0
  173. sqlalchemy/orm/relationships.py +3500 -0
  174. sqlalchemy/orm/scoping.py +2165 -0
  175. sqlalchemy/orm/session.py +5301 -0
  176. sqlalchemy/orm/state.py +1143 -0
  177. sqlalchemy/orm/state_changes.py +198 -0
  178. sqlalchemy/orm/strategies.py +3473 -0
  179. sqlalchemy/orm/strategy_options.py +2569 -0
  180. sqlalchemy/orm/sync.py +164 -0
  181. sqlalchemy/orm/unitofwork.py +796 -0
  182. sqlalchemy/orm/util.py +2424 -0
  183. sqlalchemy/orm/writeonly.py +678 -0
  184. sqlalchemy/pool/__init__.py +44 -0
  185. sqlalchemy/pool/base.py +1515 -0
  186. sqlalchemy/pool/events.py +370 -0
  187. sqlalchemy/pool/impl.py +581 -0
  188. sqlalchemy/py.typed +0 -0
  189. sqlalchemy/schema.py +70 -0
  190. sqlalchemy/sql/__init__.py +145 -0
  191. sqlalchemy/sql/_dml_constructors.py +140 -0
  192. sqlalchemy/sql/_elements_constructors.py +1850 -0
  193. sqlalchemy/sql/_orm_types.py +20 -0
  194. sqlalchemy/sql/_py_util.py +75 -0
  195. sqlalchemy/sql/_selectable_constructors.py +635 -0
  196. sqlalchemy/sql/_typing.py +460 -0
  197. sqlalchemy/sql/annotation.py +585 -0
  198. sqlalchemy/sql/base.py +2185 -0
  199. sqlalchemy/sql/cache_key.py +1057 -0
  200. sqlalchemy/sql/coercions.py +1405 -0
  201. sqlalchemy/sql/compiler.py +7818 -0
  202. sqlalchemy/sql/crud.py +1669 -0
  203. sqlalchemy/sql/ddl.py +1378 -0
  204. sqlalchemy/sql/default_comparator.py +552 -0
  205. sqlalchemy/sql/dml.py +1817 -0
  206. sqlalchemy/sql/elements.py +5499 -0
  207. sqlalchemy/sql/events.py +455 -0
  208. sqlalchemy/sql/expression.py +162 -0
  209. sqlalchemy/sql/functions.py +2055 -0
  210. sqlalchemy/sql/lambdas.py +1449 -0
  211. sqlalchemy/sql/naming.py +212 -0
  212. sqlalchemy/sql/operators.py +2579 -0
  213. sqlalchemy/sql/roles.py +323 -0
  214. sqlalchemy/sql/schema.py +6158 -0
  215. sqlalchemy/sql/selectable.py +7004 -0
  216. sqlalchemy/sql/sqltypes.py +3827 -0
  217. sqlalchemy/sql/traversals.py +1024 -0
  218. sqlalchemy/sql/type_api.py +2339 -0
  219. sqlalchemy/sql/util.py +1486 -0
  220. sqlalchemy/sql/visitors.py +1165 -0
  221. sqlalchemy/testing/__init__.py +96 -0
  222. sqlalchemy/testing/assertions.py +989 -0
  223. sqlalchemy/testing/assertsql.py +516 -0
  224. sqlalchemy/testing/asyncio.py +135 -0
  225. sqlalchemy/testing/config.py +427 -0
  226. sqlalchemy/testing/engines.py +472 -0
  227. sqlalchemy/testing/entities.py +117 -0
  228. sqlalchemy/testing/exclusions.py +435 -0
  229. sqlalchemy/testing/fixtures/__init__.py +28 -0
  230. sqlalchemy/testing/fixtures/base.py +366 -0
  231. sqlalchemy/testing/fixtures/mypy.py +312 -0
  232. sqlalchemy/testing/fixtures/orm.py +227 -0
  233. sqlalchemy/testing/fixtures/sql.py +503 -0
  234. sqlalchemy/testing/pickleable.py +155 -0
  235. sqlalchemy/testing/plugin/__init__.py +6 -0
  236. sqlalchemy/testing/plugin/bootstrap.py +51 -0
  237. sqlalchemy/testing/plugin/plugin_base.py +779 -0
  238. sqlalchemy/testing/plugin/pytestplugin.py +868 -0
  239. sqlalchemy/testing/profiling.py +324 -0
  240. sqlalchemy/testing/provision.py +496 -0
  241. sqlalchemy/testing/requirements.py +1818 -0
  242. sqlalchemy/testing/schema.py +224 -0
  243. sqlalchemy/testing/suite/__init__.py +19 -0
  244. sqlalchemy/testing/suite/test_cte.py +211 -0
  245. sqlalchemy/testing/suite/test_ddl.py +389 -0
  246. sqlalchemy/testing/suite/test_deprecations.py +153 -0
  247. sqlalchemy/testing/suite/test_dialect.py +740 -0
  248. sqlalchemy/testing/suite/test_insert.py +630 -0
  249. sqlalchemy/testing/suite/test_reflection.py +3225 -0
  250. sqlalchemy/testing/suite/test_results.py +502 -0
  251. sqlalchemy/testing/suite/test_rowcount.py +258 -0
  252. sqlalchemy/testing/suite/test_select.py +1999 -0
  253. sqlalchemy/testing/suite/test_sequence.py +317 -0
  254. sqlalchemy/testing/suite/test_types.py +2141 -0
  255. sqlalchemy/testing/suite/test_unicode_ddl.py +189 -0
  256. sqlalchemy/testing/suite/test_update_delete.py +139 -0
  257. sqlalchemy/testing/util.py +537 -0
  258. sqlalchemy/testing/warnings.py +52 -0
  259. sqlalchemy/types.py +76 -0
  260. sqlalchemy/util/__init__.py +160 -0
  261. sqlalchemy/util/_collections.py +715 -0
  262. sqlalchemy/util/_concurrency_py3k.py +288 -0
  263. sqlalchemy/util/_has_cy.py +40 -0
  264. sqlalchemy/util/_py_collections.py +541 -0
  265. sqlalchemy/util/compat.py +301 -0
  266. sqlalchemy/util/concurrency.py +108 -0
  267. sqlalchemy/util/deprecations.py +401 -0
  268. sqlalchemy/util/langhelpers.py +2218 -0
  269. sqlalchemy/util/preloaded.py +150 -0
  270. sqlalchemy/util/queue.py +322 -0
  271. sqlalchemy/util/tool_support.py +201 -0
  272. sqlalchemy/util/topological.py +120 -0
  273. sqlalchemy/util/typing.py +629 -0
@@ -0,0 +1,370 @@
1
+ # pool/events.py
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 __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
+ e.g.::
35
+
36
+ from sqlalchemy import event
37
+
38
+ def my_on_checkout(dbapi_conn, connection_rec, connection_proxy):
39
+ "handle an on checkout event"
40
+
41
+ event.listen(Pool, 'checkout', my_on_checkout)
42
+
43
+ In addition to accepting the :class:`_pool.Pool` class and
44
+ :class:`_pool.Pool` instances, :class:`_events.PoolEvents` also accepts
45
+ :class:`_engine.Engine` objects and the :class:`_engine.Engine` class as
46
+ targets, which will be resolved to the ``.pool`` attribute of the
47
+ given engine or the :class:`_pool.Pool` class::
48
+
49
+ engine = create_engine("postgresql+psycopg2://scott:tiger@localhost/test")
50
+
51
+ # will associate with engine.pool
52
+ event.listen(engine, 'checkout', my_on_checkout)
53
+
54
+ """ # noqa: E501
55
+
56
+ _target_class_doc = "SomeEngineOrPool"
57
+ _dispatch_target = Pool
58
+
59
+ @util.preload_module("sqlalchemy.engine")
60
+ @classmethod
61
+ def _accept_with(
62
+ cls,
63
+ target: Union[Pool, Type[Pool], Engine, Type[Engine]],
64
+ identifier: str,
65
+ ) -> Optional[Union[Pool, Type[Pool]]]:
66
+ if not typing.TYPE_CHECKING:
67
+ Engine = util.preloaded.engine.Engine
68
+
69
+ if isinstance(target, type):
70
+ if issubclass(target, Engine):
71
+ return Pool
72
+ else:
73
+ assert issubclass(target, Pool)
74
+ return target
75
+ elif isinstance(target, Engine):
76
+ return target.pool
77
+ elif isinstance(target, Pool):
78
+ return target
79
+ elif hasattr(target, "_no_async_engine_events"):
80
+ target._no_async_engine_events()
81
+ else:
82
+ return None
83
+
84
+ @classmethod
85
+ def _listen(
86
+ cls,
87
+ event_key: event._EventKey[Pool],
88
+ **kw: Any,
89
+ ) -> None:
90
+ target = event_key.dispatch_target
91
+
92
+ kw.setdefault("asyncio", target._is_asyncio)
93
+
94
+ event_key.base_listen(**kw)
95
+
96
+ def connect(
97
+ self,
98
+ dbapi_connection: DBAPIConnection,
99
+ connection_record: ConnectionPoolEntry,
100
+ ) -> None:
101
+ """Called at the moment a particular DBAPI connection is first
102
+ created for a given :class:`_pool.Pool`.
103
+
104
+ This event allows one to capture the point directly after which
105
+ the DBAPI module-level ``.connect()`` method has been used in order
106
+ to produce a new DBAPI connection.
107
+
108
+ :param dbapi_connection: a DBAPI connection.
109
+ The :attr:`.ConnectionPoolEntry.dbapi_connection` attribute.
110
+
111
+ :param connection_record: the :class:`.ConnectionPoolEntry` managing
112
+ the DBAPI connection.
113
+
114
+ """
115
+
116
+ def first_connect(
117
+ self,
118
+ dbapi_connection: DBAPIConnection,
119
+ connection_record: ConnectionPoolEntry,
120
+ ) -> None:
121
+ """Called exactly once for the first time a DBAPI connection is
122
+ checked out from a particular :class:`_pool.Pool`.
123
+
124
+ The rationale for :meth:`_events.PoolEvents.first_connect`
125
+ is to determine
126
+ information about a particular series of database connections based
127
+ on the settings used for all connections. Since a particular
128
+ :class:`_pool.Pool`
129
+ refers to a single "creator" function (which in terms
130
+ of a :class:`_engine.Engine`
131
+ refers to the URL and connection options used),
132
+ it is typically valid to make observations about a single connection
133
+ that can be safely assumed to be valid about all subsequent
134
+ connections, such as the database version, the server and client
135
+ encoding settings, collation settings, and many others.
136
+
137
+ :param dbapi_connection: a DBAPI connection.
138
+ The :attr:`.ConnectionPoolEntry.dbapi_connection` attribute.
139
+
140
+ :param connection_record: the :class:`.ConnectionPoolEntry` managing
141
+ the DBAPI connection.
142
+
143
+ """
144
+
145
+ def checkout(
146
+ self,
147
+ dbapi_connection: DBAPIConnection,
148
+ connection_record: ConnectionPoolEntry,
149
+ connection_proxy: PoolProxiedConnection,
150
+ ) -> None:
151
+ """Called when a connection is retrieved from the Pool.
152
+
153
+ :param dbapi_connection: a DBAPI connection.
154
+ The :attr:`.ConnectionPoolEntry.dbapi_connection` attribute.
155
+
156
+ :param connection_record: the :class:`.ConnectionPoolEntry` managing
157
+ the DBAPI connection.
158
+
159
+ :param connection_proxy: the :class:`.PoolProxiedConnection` object
160
+ which will proxy the public interface of the DBAPI connection for the
161
+ lifespan of the checkout.
162
+
163
+ If you raise a :class:`~sqlalchemy.exc.DisconnectionError`, the current
164
+ connection will be disposed and a fresh connection retrieved.
165
+ Processing of all checkout listeners will abort and restart
166
+ using the new connection.
167
+
168
+ .. seealso:: :meth:`_events.ConnectionEvents.engine_connect`
169
+ - a similar event
170
+ which occurs upon creation of a new :class:`_engine.Connection`.
171
+
172
+ """
173
+
174
+ def checkin(
175
+ self,
176
+ dbapi_connection: Optional[DBAPIConnection],
177
+ connection_record: ConnectionPoolEntry,
178
+ ) -> None:
179
+ """Called when a connection returns to the pool.
180
+
181
+ Note that the connection may be closed, and may be None if the
182
+ connection has been invalidated. ``checkin`` will not be called
183
+ for detached connections. (They do not return to the pool.)
184
+
185
+ :param dbapi_connection: a DBAPI connection.
186
+ The :attr:`.ConnectionPoolEntry.dbapi_connection` attribute.
187
+
188
+ :param connection_record: the :class:`.ConnectionPoolEntry` managing
189
+ the DBAPI connection.
190
+
191
+ """
192
+
193
+ @event._legacy_signature(
194
+ "2.0",
195
+ ["dbapi_connection", "connection_record"],
196
+ lambda dbapi_connection, connection_record, reset_state: (
197
+ dbapi_connection,
198
+ connection_record,
199
+ ),
200
+ )
201
+ def reset(
202
+ self,
203
+ dbapi_connection: DBAPIConnection,
204
+ connection_record: ConnectionPoolEntry,
205
+ reset_state: PoolResetState,
206
+ ) -> None:
207
+ """Called before the "reset" action occurs for a pooled connection.
208
+
209
+ This event represents
210
+ when the ``rollback()`` method is called on the DBAPI connection
211
+ before it is returned to the pool or discarded.
212
+ A custom "reset" strategy may be implemented using this event hook,
213
+ which may also be combined with disabling the default "reset"
214
+ behavior using the :paramref:`_pool.Pool.reset_on_return` parameter.
215
+
216
+ The primary difference between the :meth:`_events.PoolEvents.reset` and
217
+ :meth:`_events.PoolEvents.checkin` events are that
218
+ :meth:`_events.PoolEvents.reset` is called not just for pooled
219
+ connections that are being returned to the pool, but also for
220
+ connections that were detached using the
221
+ :meth:`_engine.Connection.detach` method as well as asyncio connections
222
+ that are being discarded due to garbage collection taking place on
223
+ connections before the connection was checked in.
224
+
225
+ Note that the event **is not** invoked for connections that were
226
+ invalidated using :meth:`_engine.Connection.invalidate`. These
227
+ events may be intercepted using the :meth:`.PoolEvents.soft_invalidate`
228
+ and :meth:`.PoolEvents.invalidate` event hooks, and all "connection
229
+ close" events may be intercepted using :meth:`.PoolEvents.close`.
230
+
231
+ The :meth:`_events.PoolEvents.reset` event is usually followed by the
232
+ :meth:`_events.PoolEvents.checkin` event, except in those
233
+ cases where the connection is discarded immediately after reset.
234
+
235
+ :param dbapi_connection: a DBAPI connection.
236
+ The :attr:`.ConnectionPoolEntry.dbapi_connection` attribute.
237
+
238
+ :param connection_record: the :class:`.ConnectionPoolEntry` managing
239
+ the DBAPI connection.
240
+
241
+ :param reset_state: :class:`.PoolResetState` instance which provides
242
+ information about the circumstances under which the connection
243
+ is being reset.
244
+
245
+ .. versionadded:: 2.0
246
+
247
+ .. seealso::
248
+
249
+ :ref:`pool_reset_on_return`
250
+
251
+ :meth:`_events.ConnectionEvents.rollback`
252
+
253
+ :meth:`_events.ConnectionEvents.commit`
254
+
255
+ """
256
+
257
+ def invalidate(
258
+ self,
259
+ dbapi_connection: DBAPIConnection,
260
+ connection_record: ConnectionPoolEntry,
261
+ exception: Optional[BaseException],
262
+ ) -> None:
263
+ """Called when a DBAPI connection is to be "invalidated".
264
+
265
+ This event is called any time the
266
+ :meth:`.ConnectionPoolEntry.invalidate` method is invoked, either from
267
+ API usage or via "auto-invalidation", without the ``soft`` flag.
268
+
269
+ The event occurs before a final attempt to call ``.close()`` on the
270
+ connection occurs.
271
+
272
+ :param dbapi_connection: a DBAPI connection.
273
+ The :attr:`.ConnectionPoolEntry.dbapi_connection` attribute.
274
+
275
+ :param connection_record: the :class:`.ConnectionPoolEntry` managing
276
+ the DBAPI connection.
277
+
278
+ :param exception: the exception object corresponding to the reason
279
+ for this invalidation, if any. May be ``None``.
280
+
281
+ .. seealso::
282
+
283
+ :ref:`pool_connection_invalidation`
284
+
285
+ """
286
+
287
+ def soft_invalidate(
288
+ self,
289
+ dbapi_connection: DBAPIConnection,
290
+ connection_record: ConnectionPoolEntry,
291
+ exception: Optional[BaseException],
292
+ ) -> None:
293
+ """Called when a DBAPI connection is to be "soft invalidated".
294
+
295
+ This event is called any time the
296
+ :meth:`.ConnectionPoolEntry.invalidate`
297
+ method is invoked with the ``soft`` flag.
298
+
299
+ Soft invalidation refers to when the connection record that tracks
300
+ this connection will force a reconnect after the current connection
301
+ is checked in. It does not actively close the dbapi_connection
302
+ at the point at which it is called.
303
+
304
+ :param dbapi_connection: a DBAPI connection.
305
+ The :attr:`.ConnectionPoolEntry.dbapi_connection` attribute.
306
+
307
+ :param connection_record: the :class:`.ConnectionPoolEntry` managing
308
+ the DBAPI connection.
309
+
310
+ :param exception: the exception object corresponding to the reason
311
+ for this invalidation, if any. May be ``None``.
312
+
313
+ """
314
+
315
+ def close(
316
+ self,
317
+ dbapi_connection: DBAPIConnection,
318
+ connection_record: ConnectionPoolEntry,
319
+ ) -> None:
320
+ """Called when a DBAPI connection is closed.
321
+
322
+ The event is emitted before the close occurs.
323
+
324
+ The close of a connection can fail; typically this is because
325
+ the connection is already closed. If the close operation fails,
326
+ the connection is discarded.
327
+
328
+ The :meth:`.close` event corresponds to a connection that's still
329
+ associated with the pool. To intercept close events for detached
330
+ connections use :meth:`.close_detached`.
331
+
332
+ :param dbapi_connection: a DBAPI connection.
333
+ The :attr:`.ConnectionPoolEntry.dbapi_connection` attribute.
334
+
335
+ :param connection_record: the :class:`.ConnectionPoolEntry` managing
336
+ the DBAPI connection.
337
+
338
+ """
339
+
340
+ def detach(
341
+ self,
342
+ dbapi_connection: DBAPIConnection,
343
+ connection_record: ConnectionPoolEntry,
344
+ ) -> None:
345
+ """Called when a DBAPI connection is "detached" from a pool.
346
+
347
+ This event is emitted after the detach occurs. The connection
348
+ is no longer associated with the given connection record.
349
+
350
+ :param dbapi_connection: a DBAPI connection.
351
+ The :attr:`.ConnectionPoolEntry.dbapi_connection` attribute.
352
+
353
+ :param connection_record: the :class:`.ConnectionPoolEntry` managing
354
+ the DBAPI connection.
355
+
356
+ """
357
+
358
+ def close_detached(self, dbapi_connection: DBAPIConnection) -> None:
359
+ """Called when a detached DBAPI connection is closed.
360
+
361
+ The event is emitted before the close occurs.
362
+
363
+ The close of a connection can fail; typically this is because
364
+ the connection is already closed. If the close operation fails,
365
+ the connection is discarded.
366
+
367
+ :param dbapi_connection: a DBAPI connection.
368
+ The :attr:`.ConnectionPoolEntry.dbapi_connection` attribute.
369
+
370
+ """