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,458 @@
1
+ # sql/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
+
8
+ from __future__ import annotations
9
+
10
+ from typing import Any
11
+ from typing import TYPE_CHECKING
12
+
13
+ from .base import SchemaEventTarget
14
+ from .. import event
15
+
16
+ if TYPE_CHECKING:
17
+ from .schema import Column
18
+ from .schema import Constraint
19
+ from .schema import SchemaItem
20
+ from .schema import Table
21
+ from ..engine.base import Connection
22
+ from ..engine.interfaces import ReflectedColumn
23
+ from ..engine.reflection import Inspector
24
+
25
+
26
+ class DDLEvents(event.Events[SchemaEventTarget]):
27
+ """
28
+ Define event listeners for schema objects,
29
+ that is, :class:`.SchemaItem` and other :class:`.SchemaEventTarget`
30
+ subclasses, including :class:`_schema.MetaData`, :class:`_schema.Table`,
31
+ :class:`_schema.Column`, etc.
32
+
33
+ **Create / Drop Events**
34
+
35
+ Events emitted when CREATE and DROP commands are emitted to the database.
36
+ The event hooks in this category include :meth:`.DDLEvents.before_create`,
37
+ :meth:`.DDLEvents.after_create`, :meth:`.DDLEvents.before_drop`, and
38
+ :meth:`.DDLEvents.after_drop`.
39
+
40
+ These events are emitted when using schema-level methods such as
41
+ :meth:`.MetaData.create_all` and :meth:`.MetaData.drop_all`. Per-object
42
+ create/drop methods such as :meth:`.Table.create`, :meth:`.Table.drop`,
43
+ :meth:`.Index.create` are also included, as well as dialect-specific
44
+ methods such as :meth:`_postgresql.ENUM.create`.
45
+
46
+ .. versionadded:: 2.0 :class:`.DDLEvents` event hooks now take place
47
+ for non-table objects including constraints, indexes, and
48
+ dialect-specific schema types.
49
+
50
+ Event hooks may be attached directly to a :class:`_schema.Table` object or
51
+ to a :class:`_schema.MetaData` collection, as well as to any
52
+ :class:`.SchemaItem` class or object that can be individually created and
53
+ dropped using a distinct SQL command. Such classes include :class:`.Index`,
54
+ :class:`.Sequence`, and dialect-specific classes such as
55
+ :class:`_postgresql.ENUM`.
56
+
57
+ Example using the :meth:`.DDLEvents.after_create` event, where a custom
58
+ event hook will emit an ``ALTER TABLE`` command on the current connection,
59
+ after ``CREATE TABLE`` is emitted::
60
+
61
+ from sqlalchemy import create_engine
62
+ from sqlalchemy import event
63
+ from sqlalchemy import Table, Column, Metadata, Integer
64
+
65
+ m = MetaData()
66
+ some_table = Table("some_table", m, Column("data", Integer))
67
+
68
+
69
+ @event.listens_for(some_table, "after_create")
70
+ def after_create(target, connection, **kw):
71
+ connection.execute(
72
+ text("ALTER TABLE %s SET name=foo_%s" % (target.name, target.name))
73
+ )
74
+
75
+
76
+ some_engine = create_engine("postgresql://scott:tiger@host/test")
77
+
78
+ # will emit "CREATE TABLE some_table" as well as the above
79
+ # "ALTER TABLE" statement afterwards
80
+ m.create_all(some_engine)
81
+
82
+ Constraint objects such as :class:`.ForeignKeyConstraint`,
83
+ :class:`.UniqueConstraint`, :class:`.CheckConstraint` may also be
84
+ subscribed to these events, however they will **not** normally produce
85
+ events as these objects are usually rendered inline within an
86
+ enclosing ``CREATE TABLE`` statement and implicitly dropped from a
87
+ ``DROP TABLE`` statement.
88
+
89
+ For the :class:`.Index` construct, the event hook will be emitted
90
+ for ``CREATE INDEX``, however SQLAlchemy does not normally emit
91
+ ``DROP INDEX`` when dropping tables as this is again implicit within the
92
+ ``DROP TABLE`` statement.
93
+
94
+ .. versionadded:: 2.0 Support for :class:`.SchemaItem` objects
95
+ for create/drop events was expanded from its previous support for
96
+ :class:`.MetaData` and :class:`.Table` to also include
97
+ :class:`.Constraint` and all subclasses, :class:`.Index`,
98
+ :class:`.Sequence` and some type-related constructs such as
99
+ :class:`_postgresql.ENUM`.
100
+
101
+ .. note:: These event hooks are only emitted within the scope of
102
+ SQLAlchemy's create/drop methods; they are not necessarily supported
103
+ by tools such as `alembic <https://alembic.sqlalchemy.org>`_.
104
+
105
+
106
+ **Attachment Events**
107
+
108
+ Attachment events are provided to customize
109
+ behavior whenever a child schema element is associated
110
+ with a parent, such as when a :class:`_schema.Column` is associated
111
+ with its :class:`_schema.Table`, when a
112
+ :class:`_schema.ForeignKeyConstraint`
113
+ is associated with a :class:`_schema.Table`, etc. These events include
114
+ :meth:`.DDLEvents.before_parent_attach` and
115
+ :meth:`.DDLEvents.after_parent_attach`.
116
+
117
+ **Reflection Events**
118
+
119
+ The :meth:`.DDLEvents.column_reflect` event is used to intercept
120
+ and modify the in-Python definition of database columns when
121
+ :term:`reflection` of database tables proceeds.
122
+
123
+ **Use with Generic DDL**
124
+
125
+ DDL events integrate closely with the
126
+ :class:`.DDL` class and the :class:`.ExecutableDDLElement` hierarchy
127
+ of DDL clause constructs, which are themselves appropriate
128
+ as listener callables::
129
+
130
+ from sqlalchemy import DDL
131
+
132
+ event.listen(
133
+ some_table,
134
+ "after_create",
135
+ DDL("ALTER TABLE %(table)s SET name=foo_%(table)s"),
136
+ )
137
+
138
+ **Event Propagation to MetaData Copies**
139
+
140
+ For all :class:`.DDLEvent` events, the ``propagate=True`` keyword argument
141
+ will ensure that a given event handler is propagated to copies of the
142
+ object, which are made when using the :meth:`_schema.Table.to_metadata`
143
+ method::
144
+
145
+ from sqlalchemy import DDL
146
+
147
+ metadata = MetaData()
148
+ some_table = Table("some_table", metadata, Column("data", Integer))
149
+
150
+ event.listen(
151
+ some_table,
152
+ "after_create",
153
+ DDL("ALTER TABLE %(table)s SET name=foo_%(table)s"),
154
+ propagate=True,
155
+ )
156
+
157
+ new_metadata = MetaData()
158
+ new_table = some_table.to_metadata(new_metadata)
159
+
160
+ The above :class:`.DDL` object will be associated with the
161
+ :meth:`.DDLEvents.after_create` event for both the ``some_table`` and
162
+ the ``new_table`` :class:`.Table` objects.
163
+
164
+ .. seealso::
165
+
166
+ :ref:`event_toplevel`
167
+
168
+ :class:`.ExecutableDDLElement`
169
+
170
+ :class:`.DDL`
171
+
172
+ :ref:`schema_ddl_sequences`
173
+
174
+ """ # noqa: E501
175
+
176
+ _target_class_doc = "SomeSchemaClassOrObject"
177
+ _dispatch_target = SchemaEventTarget
178
+
179
+ def before_create(
180
+ self, target: SchemaEventTarget, connection: Connection, **kw: Any
181
+ ) -> None:
182
+ r"""Called before CREATE statements are emitted.
183
+
184
+ :param target: the :class:`.SchemaObject`, such as a
185
+ :class:`_schema.MetaData` or :class:`_schema.Table`
186
+ but also including all create/drop objects such as
187
+ :class:`.Index`, :class:`.Sequence`, etc.,
188
+ object which is the target of the event.
189
+
190
+ .. versionadded:: 2.0 Support for all :class:`.SchemaItem` objects
191
+ was added.
192
+
193
+ :param connection: the :class:`_engine.Connection` where the
194
+ CREATE statement or statements will be emitted.
195
+ :param \**kw: additional keyword arguments relevant
196
+ to the event. The contents of this dictionary
197
+ may vary across releases, and include the
198
+ list of tables being generated for a metadata-level
199
+ event, the checkfirst flag, and other
200
+ elements used by internal events.
201
+
202
+ :func:`.event.listen` accepts the ``propagate=True``
203
+ modifier for this event; when True, the listener function will
204
+ be established for any copies made of the target object,
205
+ i.e. those copies that are generated when
206
+ :meth:`_schema.Table.to_metadata` is used.
207
+
208
+ :func:`.event.listen` accepts the ``insert=True``
209
+ modifier for this event; when True, the listener function will
210
+ be prepended to the internal list of events upon discovery, and execute
211
+ before registered listener functions that do not pass this argument.
212
+
213
+ """
214
+
215
+ def after_create(
216
+ self, target: SchemaEventTarget, connection: Connection, **kw: Any
217
+ ) -> None:
218
+ r"""Called after CREATE statements are emitted.
219
+
220
+ :param target: the :class:`.SchemaObject`, such as a
221
+ :class:`_schema.MetaData` or :class:`_schema.Table`
222
+ but also including all create/drop objects such as
223
+ :class:`.Index`, :class:`.Sequence`, etc.,
224
+ object which is the target of the event.
225
+
226
+ .. versionadded:: 2.0 Support for all :class:`.SchemaItem` objects
227
+ was added.
228
+
229
+ :param connection: the :class:`_engine.Connection` where the
230
+ CREATE statement or statements have been emitted.
231
+ :param \**kw: additional keyword arguments relevant
232
+ to the event. The contents of this dictionary
233
+ may vary across releases, and include the
234
+ list of tables being generated for a metadata-level
235
+ event, the checkfirst flag, and other
236
+ elements used by internal events.
237
+
238
+ :func:`.event.listen` also accepts the ``propagate=True``
239
+ modifier for this event; when True, the listener function will
240
+ be established for any copies made of the target object,
241
+ i.e. those copies that are generated when
242
+ :meth:`_schema.Table.to_metadata` is used.
243
+
244
+ """
245
+
246
+ def before_drop(
247
+ self, target: SchemaEventTarget, connection: Connection, **kw: Any
248
+ ) -> None:
249
+ r"""Called before DROP statements are emitted.
250
+
251
+ :param target: the :class:`.SchemaObject`, such as a
252
+ :class:`_schema.MetaData` or :class:`_schema.Table`
253
+ but also including all create/drop objects such as
254
+ :class:`.Index`, :class:`.Sequence`, etc.,
255
+ object which is the target of the event.
256
+
257
+ .. versionadded:: 2.0 Support for all :class:`.SchemaItem` objects
258
+ was added.
259
+
260
+ :param connection: the :class:`_engine.Connection` where the
261
+ DROP statement or statements will be emitted.
262
+ :param \**kw: additional keyword arguments relevant
263
+ to the event. The contents of this dictionary
264
+ may vary across releases, and include the
265
+ list of tables being generated for a metadata-level
266
+ event, the checkfirst flag, and other
267
+ elements used by internal events.
268
+
269
+ :func:`.event.listen` also accepts the ``propagate=True``
270
+ modifier for this event; when True, the listener function will
271
+ be established for any copies made of the target object,
272
+ i.e. those copies that are generated when
273
+ :meth:`_schema.Table.to_metadata` is used.
274
+
275
+ """
276
+
277
+ def after_drop(
278
+ self, target: SchemaEventTarget, connection: Connection, **kw: Any
279
+ ) -> None:
280
+ r"""Called after DROP statements are emitted.
281
+
282
+ :param target: the :class:`.SchemaObject`, such as a
283
+ :class:`_schema.MetaData` or :class:`_schema.Table`
284
+ but also including all create/drop objects such as
285
+ :class:`.Index`, :class:`.Sequence`, etc.,
286
+ object which is the target of the event.
287
+
288
+ .. versionadded:: 2.0 Support for all :class:`.SchemaItem` objects
289
+ was added.
290
+
291
+ :param connection: the :class:`_engine.Connection` where the
292
+ DROP statement or statements have been emitted.
293
+ :param \**kw: additional keyword arguments relevant
294
+ to the event. The contents of this dictionary
295
+ may vary across releases, and include the
296
+ list of tables being generated for a metadata-level
297
+ event, the checkfirst flag, and other
298
+ elements used by internal events.
299
+
300
+ :func:`.event.listen` also accepts the ``propagate=True``
301
+ modifier for this event; when True, the listener function will
302
+ be established for any copies made of the target object,
303
+ i.e. those copies that are generated when
304
+ :meth:`_schema.Table.to_metadata` is used.
305
+
306
+ """
307
+
308
+ def before_parent_attach(
309
+ self, target: SchemaEventTarget, parent: SchemaItem
310
+ ) -> None:
311
+ """Called before a :class:`.SchemaItem` is associated with
312
+ a parent :class:`.SchemaItem`.
313
+
314
+ :param target: the target object
315
+ :param parent: the parent to which the target is being attached.
316
+
317
+ :func:`.event.listen` also accepts the ``propagate=True``
318
+ modifier for this event; when True, the listener function will
319
+ be established for any copies made of the target object,
320
+ i.e. those copies that are generated when
321
+ :meth:`_schema.Table.to_metadata` is used.
322
+
323
+ """
324
+
325
+ def after_parent_attach(
326
+ self, target: SchemaEventTarget, parent: SchemaItem
327
+ ) -> None:
328
+ """Called after a :class:`.SchemaItem` is associated with
329
+ a parent :class:`.SchemaItem`.
330
+
331
+ :param target: the target object
332
+ :param parent: the parent to which the target is being attached.
333
+
334
+ :func:`.event.listen` also accepts the ``propagate=True``
335
+ modifier for this event; when True, the listener function will
336
+ be established for any copies made of the target object,
337
+ i.e. those copies that are generated when
338
+ :meth:`_schema.Table.to_metadata` is used.
339
+
340
+ """
341
+
342
+ def _sa_event_column_added_to_pk_constraint(
343
+ self, const: Constraint, col: Column[Any]
344
+ ) -> None:
345
+ """internal event hook used for primary key naming convention
346
+ updates.
347
+
348
+ """
349
+
350
+ def column_reflect(
351
+ self, inspector: Inspector, table: Table, column_info: ReflectedColumn
352
+ ) -> None:
353
+ """Called for each unit of 'column info' retrieved when
354
+ a :class:`_schema.Table` is being reflected.
355
+
356
+ This event is most easily used by applying it to a specific
357
+ :class:`_schema.MetaData` instance, where it will take effect for
358
+ all :class:`_schema.Table` objects within that
359
+ :class:`_schema.MetaData` that undergo reflection::
360
+
361
+ metadata = MetaData()
362
+
363
+
364
+ @event.listens_for(metadata, "column_reflect")
365
+ def receive_column_reflect(inspector, table, column_info):
366
+ # receives for all Table objects that are reflected
367
+ # under this MetaData
368
+ ...
369
+
370
+
371
+ # will use the above event hook
372
+ my_table = Table("my_table", metadata, autoload_with=some_engine)
373
+
374
+ .. versionadded:: 1.4.0b2 The :meth:`_events.DDLEvents.column_reflect`
375
+ hook may now be applied to a :class:`_schema.MetaData` object as
376
+ well as the :class:`_schema.MetaData` class itself where it will
377
+ take place for all :class:`_schema.Table` objects associated with
378
+ the targeted :class:`_schema.MetaData`.
379
+
380
+ It may also be applied to the :class:`_schema.Table` class across
381
+ the board::
382
+
383
+ from sqlalchemy import Table
384
+
385
+
386
+ @event.listens_for(Table, "column_reflect")
387
+ def receive_column_reflect(inspector, table, column_info):
388
+ # receives for all Table objects that are reflected
389
+ ...
390
+
391
+ It can also be applied to a specific :class:`_schema.Table` at the
392
+ point that one is being reflected using the
393
+ :paramref:`_schema.Table.listeners` parameter::
394
+
395
+ t1 = Table(
396
+ "my_table",
397
+ autoload_with=some_engine,
398
+ listeners=[("column_reflect", receive_column_reflect)],
399
+ )
400
+
401
+ The dictionary of column information as returned by the
402
+ dialect is passed, and can be modified. The dictionary
403
+ is that returned in each element of the list returned
404
+ by :meth:`.reflection.Inspector.get_columns`:
405
+
406
+ * ``name`` - the column's name, is applied to the
407
+ :paramref:`_schema.Column.name` parameter
408
+
409
+ * ``type`` - the type of this column, which should be an instance
410
+ of :class:`~sqlalchemy.types.TypeEngine`, is applied to the
411
+ :paramref:`_schema.Column.type` parameter
412
+
413
+ * ``nullable`` - boolean flag if the column is NULL or NOT NULL,
414
+ is applied to the :paramref:`_schema.Column.nullable` parameter
415
+
416
+ * ``default`` - the column's server default value. This is
417
+ normally specified as a plain string SQL expression, however the
418
+ event can pass a :class:`.FetchedValue`, :class:`.DefaultClause`,
419
+ or :func:`_expression.text` object as well. Is applied to the
420
+ :paramref:`_schema.Column.server_default` parameter
421
+
422
+ The event is called before any action is taken against
423
+ this dictionary, and the contents can be modified; the following
424
+ additional keys may be added to the dictionary to further modify
425
+ how the :class:`_schema.Column` is constructed:
426
+
427
+
428
+ * ``key`` - the string key that will be used to access this
429
+ :class:`_schema.Column` in the ``.c`` collection; will be applied
430
+ to the :paramref:`_schema.Column.key` parameter. Is also used
431
+ for ORM mapping. See the section
432
+ :ref:`mapper_automated_reflection_schemes` for an example.
433
+
434
+ * ``quote`` - force or un-force quoting on the column name;
435
+ is applied to the :paramref:`_schema.Column.quote` parameter.
436
+
437
+ * ``info`` - a dictionary of arbitrary data to follow along with
438
+ the :class:`_schema.Column`, is applied to the
439
+ :paramref:`_schema.Column.info` parameter.
440
+
441
+ :func:`.event.listen` also accepts the ``propagate=True``
442
+ modifier for this event; when True, the listener function will
443
+ be established for any copies made of the target object,
444
+ i.e. those copies that are generated when
445
+ :meth:`_schema.Table.to_metadata` is used.
446
+
447
+ .. seealso::
448
+
449
+ :ref:`mapper_automated_reflection_schemes` -
450
+ in the ORM mapping documentation
451
+
452
+ :ref:`automap_intercepting_columns` -
453
+ in the :ref:`automap_toplevel` documentation
454
+
455
+ :ref:`metadata_reflection_dbagnostic_types` - in
456
+ the :ref:`metadata_reflection_toplevel` documentation
457
+
458
+ """
@@ -0,0 +1,159 @@
1
+ # sql/expression.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
+ """Defines the public namespace for SQL expression constructs."""
9
+
10
+
11
+ from __future__ import annotations
12
+
13
+ from ._dml_constructors import delete as delete
14
+ from ._dml_constructors import insert as insert
15
+ from ._dml_constructors import update as update
16
+ from ._elements_constructors import all_ as all_
17
+ from ._elements_constructors import and_ as and_
18
+ from ._elements_constructors import any_ as any_
19
+ from ._elements_constructors import asc as asc
20
+ from ._elements_constructors import between as between
21
+ from ._elements_constructors import bindparam as bindparam
22
+ from ._elements_constructors import bitwise_not as bitwise_not
23
+ from ._elements_constructors import case as case
24
+ from ._elements_constructors import cast as cast
25
+ from ._elements_constructors import collate as collate
26
+ from ._elements_constructors import column as column
27
+ from ._elements_constructors import desc as desc
28
+ from ._elements_constructors import distinct as distinct
29
+ from ._elements_constructors import extract as extract
30
+ from ._elements_constructors import false as false
31
+ from ._elements_constructors import funcfilter as funcfilter
32
+ from ._elements_constructors import label as label
33
+ from ._elements_constructors import not_ as not_
34
+ from ._elements_constructors import null as null
35
+ from ._elements_constructors import nulls_first as nulls_first
36
+ from ._elements_constructors import nulls_last as nulls_last
37
+ from ._elements_constructors import or_ as or_
38
+ from ._elements_constructors import outparam as outparam
39
+ from ._elements_constructors import over as over
40
+ from ._elements_constructors import text as text
41
+ from ._elements_constructors import true as true
42
+ from ._elements_constructors import try_cast as try_cast
43
+ from ._elements_constructors import tuple_ as tuple_
44
+ from ._elements_constructors import type_coerce as type_coerce
45
+ from ._elements_constructors import within_group as within_group
46
+ from ._selectable_constructors import alias as alias
47
+ from ._selectable_constructors import cte as cte
48
+ from ._selectable_constructors import except_ as except_
49
+ from ._selectable_constructors import except_all as except_all
50
+ from ._selectable_constructors import exists as exists
51
+ from ._selectable_constructors import intersect as intersect
52
+ from ._selectable_constructors import intersect_all as intersect_all
53
+ from ._selectable_constructors import join as join
54
+ from ._selectable_constructors import lateral as lateral
55
+ from ._selectable_constructors import outerjoin as outerjoin
56
+ from ._selectable_constructors import select as select
57
+ from ._selectable_constructors import table as table
58
+ from ._selectable_constructors import tablesample as tablesample
59
+ from ._selectable_constructors import union as union
60
+ from ._selectable_constructors import union_all as union_all
61
+ from ._selectable_constructors import values as values
62
+ from ._typing import ColumnExpressionArgument as ColumnExpressionArgument
63
+ from .base import _from_objects as _from_objects
64
+ from .base import _select_iterables as _select_iterables
65
+ from .base import ColumnCollection as ColumnCollection
66
+ from .base import Executable as Executable
67
+ from .cache_key import CacheKey as CacheKey
68
+ from .dml import Delete as Delete
69
+ from .dml import Insert as Insert
70
+ from .dml import Update as Update
71
+ from .dml import UpdateBase as UpdateBase
72
+ from .dml import ValuesBase as ValuesBase
73
+ from .elements import _truncated_label as _truncated_label
74
+ from .elements import BinaryExpression as BinaryExpression
75
+ from .elements import BindParameter as BindParameter
76
+ from .elements import BooleanClauseList as BooleanClauseList
77
+ from .elements import Case as Case
78
+ from .elements import Cast as Cast
79
+ from .elements import ClauseElement as ClauseElement
80
+ from .elements import ClauseList as ClauseList
81
+ from .elements import CollectionAggregate as CollectionAggregate
82
+ from .elements import ColumnClause as ColumnClause
83
+ from .elements import ColumnElement as ColumnElement
84
+ from .elements import ExpressionClauseList as ExpressionClauseList
85
+ from .elements import Extract as Extract
86
+ from .elements import False_ as False_
87
+ from .elements import FunctionFilter as FunctionFilter
88
+ from .elements import Grouping as Grouping
89
+ from .elements import Label as Label
90
+ from .elements import literal as literal
91
+ from .elements import literal_column as literal_column
92
+ from .elements import Null as Null
93
+ from .elements import Over as Over
94
+ from .elements import quoted_name as quoted_name
95
+ from .elements import ReleaseSavepointClause as ReleaseSavepointClause
96
+ from .elements import RollbackToSavepointClause as RollbackToSavepointClause
97
+ from .elements import SavepointClause as SavepointClause
98
+ from .elements import SQLColumnExpression as SQLColumnExpression
99
+ from .elements import TextClause as TextClause
100
+ from .elements import True_ as True_
101
+ from .elements import TryCast as TryCast
102
+ from .elements import Tuple as Tuple
103
+ from .elements import TypeClause as TypeClause
104
+ from .elements import TypeCoerce as TypeCoerce
105
+ from .elements import UnaryExpression as UnaryExpression
106
+ from .elements import WithinGroup as WithinGroup
107
+ from .functions import func as func
108
+ from .functions import Function as Function
109
+ from .functions import FunctionElement as FunctionElement
110
+ from .functions import modifier as modifier
111
+ from .lambdas import lambda_stmt as lambda_stmt
112
+ from .lambdas import LambdaElement as LambdaElement
113
+ from .lambdas import StatementLambdaElement as StatementLambdaElement
114
+ from .operators import ColumnOperators as ColumnOperators
115
+ from .operators import custom_op as custom_op
116
+ from .operators import Operators as Operators
117
+ from .selectable import Alias as Alias
118
+ from .selectable import AliasedReturnsRows as AliasedReturnsRows
119
+ from .selectable import CompoundSelect as CompoundSelect
120
+ from .selectable import CTE as CTE
121
+ from .selectable import Exists as Exists
122
+ from .selectable import FromClause as FromClause
123
+ from .selectable import FromGrouping as FromGrouping
124
+ from .selectable import GenerativeSelect as GenerativeSelect
125
+ from .selectable import HasCTE as HasCTE
126
+ from .selectable import HasPrefixes as HasPrefixes
127
+ from .selectable import HasSuffixes as HasSuffixes
128
+ from .selectable import Join as Join
129
+ from .selectable import LABEL_STYLE_DEFAULT as LABEL_STYLE_DEFAULT
130
+ from .selectable import (
131
+ LABEL_STYLE_DISAMBIGUATE_ONLY as LABEL_STYLE_DISAMBIGUATE_ONLY,
132
+ )
133
+ from .selectable import LABEL_STYLE_NONE as LABEL_STYLE_NONE
134
+ from .selectable import (
135
+ LABEL_STYLE_TABLENAME_PLUS_COL as LABEL_STYLE_TABLENAME_PLUS_COL,
136
+ )
137
+ from .selectable import Lateral as Lateral
138
+ from .selectable import ReturnsRows as ReturnsRows
139
+ from .selectable import ScalarSelect as ScalarSelect
140
+ from .selectable import ScalarValues as ScalarValues
141
+ from .selectable import Select as Select
142
+ from .selectable import Selectable as Selectable
143
+ from .selectable import SelectBase as SelectBase
144
+ from .selectable import SelectLabelStyle as SelectLabelStyle
145
+ from .selectable import Subquery as Subquery
146
+ from .selectable import TableClause as TableClause
147
+ from .selectable import TableSample as TableSample
148
+ from .selectable import TableValuedAlias as TableValuedAlias
149
+ from .selectable import TextAsFrom as TextAsFrom
150
+ from .selectable import TextualSelect as TextualSelect
151
+ from .selectable import Values as Values
152
+ from .visitors import Visitable as Visitable
153
+
154
+ nullsfirst = nulls_first
155
+ """Synonym for the :func:`.nulls_first` function."""
156
+
157
+
158
+ nullslast = nulls_last
159
+ """Synonym for the :func:`.nulls_last` function."""