SQLAlchemy 2.1.0b2__cp313-cp313t-win_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (270) hide show
  1. sqlalchemy/__init__.py +298 -0
  2. sqlalchemy/connectors/__init__.py +18 -0
  3. sqlalchemy/connectors/aioodbc.py +171 -0
  4. sqlalchemy/connectors/asyncio.py +476 -0
  5. sqlalchemy/connectors/pyodbc.py +250 -0
  6. sqlalchemy/dialects/__init__.py +62 -0
  7. sqlalchemy/dialects/_typing.py +30 -0
  8. sqlalchemy/dialects/mssql/__init__.py +89 -0
  9. sqlalchemy/dialects/mssql/aioodbc.py +63 -0
  10. sqlalchemy/dialects/mssql/base.py +4166 -0
  11. sqlalchemy/dialects/mssql/information_schema.py +285 -0
  12. sqlalchemy/dialects/mssql/json.py +140 -0
  13. sqlalchemy/dialects/mssql/mssqlpython.py +220 -0
  14. sqlalchemy/dialects/mssql/provision.py +196 -0
  15. sqlalchemy/dialects/mssql/pymssql.py +126 -0
  16. sqlalchemy/dialects/mssql/pyodbc.py +698 -0
  17. sqlalchemy/dialects/mysql/__init__.py +106 -0
  18. sqlalchemy/dialects/mysql/_mariadb_shim.py +312 -0
  19. sqlalchemy/dialects/mysql/aiomysql.py +226 -0
  20. sqlalchemy/dialects/mysql/asyncmy.py +214 -0
  21. sqlalchemy/dialects/mysql/base.py +3877 -0
  22. sqlalchemy/dialects/mysql/cymysql.py +106 -0
  23. sqlalchemy/dialects/mysql/dml.py +279 -0
  24. sqlalchemy/dialects/mysql/enumerated.py +277 -0
  25. sqlalchemy/dialects/mysql/expression.py +146 -0
  26. sqlalchemy/dialects/mysql/json.py +92 -0
  27. sqlalchemy/dialects/mysql/mariadb.py +67 -0
  28. sqlalchemy/dialects/mysql/mariadbconnector.py +330 -0
  29. sqlalchemy/dialects/mysql/mysqlconnector.py +296 -0
  30. sqlalchemy/dialects/mysql/mysqldb.py +312 -0
  31. sqlalchemy/dialects/mysql/provision.py +153 -0
  32. sqlalchemy/dialects/mysql/pymysql.py +157 -0
  33. sqlalchemy/dialects/mysql/pyodbc.py +156 -0
  34. sqlalchemy/dialects/mysql/reflection.py +724 -0
  35. sqlalchemy/dialects/mysql/reserved_words.py +570 -0
  36. sqlalchemy/dialects/mysql/types.py +845 -0
  37. sqlalchemy/dialects/oracle/__init__.py +85 -0
  38. sqlalchemy/dialects/oracle/base.py +3977 -0
  39. sqlalchemy/dialects/oracle/cx_oracle.py +1601 -0
  40. sqlalchemy/dialects/oracle/dictionary.py +507 -0
  41. sqlalchemy/dialects/oracle/json.py +158 -0
  42. sqlalchemy/dialects/oracle/oracledb.py +909 -0
  43. sqlalchemy/dialects/oracle/provision.py +288 -0
  44. sqlalchemy/dialects/oracle/types.py +367 -0
  45. sqlalchemy/dialects/oracle/vector.py +368 -0
  46. sqlalchemy/dialects/postgresql/__init__.py +171 -0
  47. sqlalchemy/dialects/postgresql/_psycopg_common.py +229 -0
  48. sqlalchemy/dialects/postgresql/array.py +534 -0
  49. sqlalchemy/dialects/postgresql/asyncpg.py +1323 -0
  50. sqlalchemy/dialects/postgresql/base.py +5789 -0
  51. sqlalchemy/dialects/postgresql/bitstring.py +327 -0
  52. sqlalchemy/dialects/postgresql/dml.py +360 -0
  53. sqlalchemy/dialects/postgresql/ext.py +593 -0
  54. sqlalchemy/dialects/postgresql/hstore.py +423 -0
  55. sqlalchemy/dialects/postgresql/json.py +408 -0
  56. sqlalchemy/dialects/postgresql/named_types.py +521 -0
  57. sqlalchemy/dialects/postgresql/operators.py +130 -0
  58. sqlalchemy/dialects/postgresql/pg8000.py +670 -0
  59. sqlalchemy/dialects/postgresql/pg_catalog.py +344 -0
  60. sqlalchemy/dialects/postgresql/provision.py +184 -0
  61. sqlalchemy/dialects/postgresql/psycopg.py +799 -0
  62. sqlalchemy/dialects/postgresql/psycopg2.py +860 -0
  63. sqlalchemy/dialects/postgresql/psycopg2cffi.py +61 -0
  64. sqlalchemy/dialects/postgresql/ranges.py +1002 -0
  65. sqlalchemy/dialects/postgresql/types.py +388 -0
  66. sqlalchemy/dialects/sqlite/__init__.py +57 -0
  67. sqlalchemy/dialects/sqlite/aiosqlite.py +321 -0
  68. sqlalchemy/dialects/sqlite/base.py +3063 -0
  69. sqlalchemy/dialects/sqlite/dml.py +279 -0
  70. sqlalchemy/dialects/sqlite/json.py +100 -0
  71. sqlalchemy/dialects/sqlite/provision.py +229 -0
  72. sqlalchemy/dialects/sqlite/pysqlcipher.py +161 -0
  73. sqlalchemy/dialects/sqlite/pysqlite.py +754 -0
  74. sqlalchemy/dialects/type_migration_guidelines.txt +145 -0
  75. sqlalchemy/engine/__init__.py +62 -0
  76. sqlalchemy/engine/_processors_cy.cp313t-win_arm64.pyd +0 -0
  77. sqlalchemy/engine/_processors_cy.py +92 -0
  78. sqlalchemy/engine/_result_cy.cp313t-win_arm64.pyd +0 -0
  79. sqlalchemy/engine/_result_cy.py +633 -0
  80. sqlalchemy/engine/_row_cy.cp313t-win_arm64.pyd +0 -0
  81. sqlalchemy/engine/_row_cy.py +232 -0
  82. sqlalchemy/engine/_util_cy.cp313t-win_arm64.pyd +0 -0
  83. sqlalchemy/engine/_util_cy.py +136 -0
  84. sqlalchemy/engine/base.py +3354 -0
  85. sqlalchemy/engine/characteristics.py +155 -0
  86. sqlalchemy/engine/create.py +877 -0
  87. sqlalchemy/engine/cursor.py +2421 -0
  88. sqlalchemy/engine/default.py +2402 -0
  89. sqlalchemy/engine/events.py +965 -0
  90. sqlalchemy/engine/interfaces.py +3495 -0
  91. sqlalchemy/engine/mock.py +134 -0
  92. sqlalchemy/engine/processors.py +82 -0
  93. sqlalchemy/engine/reflection.py +2100 -0
  94. sqlalchemy/engine/result.py +1966 -0
  95. sqlalchemy/engine/row.py +397 -0
  96. sqlalchemy/engine/strategies.py +16 -0
  97. sqlalchemy/engine/url.py +922 -0
  98. sqlalchemy/engine/util.py +156 -0
  99. sqlalchemy/event/__init__.py +26 -0
  100. sqlalchemy/event/api.py +220 -0
  101. sqlalchemy/event/attr.py +674 -0
  102. sqlalchemy/event/base.py +472 -0
  103. sqlalchemy/event/legacy.py +258 -0
  104. sqlalchemy/event/registry.py +390 -0
  105. sqlalchemy/events.py +17 -0
  106. sqlalchemy/exc.py +922 -0
  107. sqlalchemy/ext/__init__.py +11 -0
  108. sqlalchemy/ext/associationproxy.py +2072 -0
  109. sqlalchemy/ext/asyncio/__init__.py +29 -0
  110. sqlalchemy/ext/asyncio/base.py +281 -0
  111. sqlalchemy/ext/asyncio/engine.py +1487 -0
  112. sqlalchemy/ext/asyncio/exc.py +21 -0
  113. sqlalchemy/ext/asyncio/result.py +994 -0
  114. sqlalchemy/ext/asyncio/scoping.py +1679 -0
  115. sqlalchemy/ext/asyncio/session.py +2007 -0
  116. sqlalchemy/ext/automap.py +1701 -0
  117. sqlalchemy/ext/baked.py +559 -0
  118. sqlalchemy/ext/compiler.py +600 -0
  119. sqlalchemy/ext/declarative/__init__.py +65 -0
  120. sqlalchemy/ext/declarative/extensions.py +560 -0
  121. sqlalchemy/ext/horizontal_shard.py +481 -0
  122. sqlalchemy/ext/hybrid.py +1877 -0
  123. sqlalchemy/ext/indexable.py +364 -0
  124. sqlalchemy/ext/instrumentation.py +450 -0
  125. sqlalchemy/ext/mutable.py +1081 -0
  126. sqlalchemy/ext/orderinglist.py +439 -0
  127. sqlalchemy/ext/serializer.py +185 -0
  128. sqlalchemy/future/__init__.py +16 -0
  129. sqlalchemy/future/engine.py +15 -0
  130. sqlalchemy/inspection.py +174 -0
  131. sqlalchemy/log.py +283 -0
  132. sqlalchemy/orm/__init__.py +176 -0
  133. sqlalchemy/orm/_orm_constructors.py +2694 -0
  134. sqlalchemy/orm/_typing.py +179 -0
  135. sqlalchemy/orm/attributes.py +2868 -0
  136. sqlalchemy/orm/base.py +976 -0
  137. sqlalchemy/orm/bulk_persistence.py +2152 -0
  138. sqlalchemy/orm/clsregistry.py +582 -0
  139. sqlalchemy/orm/collections.py +1568 -0
  140. sqlalchemy/orm/context.py +3471 -0
  141. sqlalchemy/orm/decl_api.py +2280 -0
  142. sqlalchemy/orm/decl_base.py +2309 -0
  143. sqlalchemy/orm/dependency.py +1306 -0
  144. sqlalchemy/orm/descriptor_props.py +1183 -0
  145. sqlalchemy/orm/dynamic.py +307 -0
  146. sqlalchemy/orm/evaluator.py +379 -0
  147. sqlalchemy/orm/events.py +3386 -0
  148. sqlalchemy/orm/exc.py +237 -0
  149. sqlalchemy/orm/identity.py +302 -0
  150. sqlalchemy/orm/instrumentation.py +746 -0
  151. sqlalchemy/orm/interfaces.py +1589 -0
  152. sqlalchemy/orm/loading.py +1684 -0
  153. sqlalchemy/orm/mapped_collection.py +557 -0
  154. sqlalchemy/orm/mapper.py +4411 -0
  155. sqlalchemy/orm/path_registry.py +829 -0
  156. sqlalchemy/orm/persistence.py +1789 -0
  157. sqlalchemy/orm/properties.py +973 -0
  158. sqlalchemy/orm/query.py +3528 -0
  159. sqlalchemy/orm/relationships.py +3570 -0
  160. sqlalchemy/orm/scoping.py +2232 -0
  161. sqlalchemy/orm/session.py +5403 -0
  162. sqlalchemy/orm/state.py +1175 -0
  163. sqlalchemy/orm/state_changes.py +196 -0
  164. sqlalchemy/orm/strategies.py +3492 -0
  165. sqlalchemy/orm/strategy_options.py +2562 -0
  166. sqlalchemy/orm/sync.py +164 -0
  167. sqlalchemy/orm/unitofwork.py +798 -0
  168. sqlalchemy/orm/util.py +2438 -0
  169. sqlalchemy/orm/writeonly.py +694 -0
  170. sqlalchemy/pool/__init__.py +41 -0
  171. sqlalchemy/pool/base.py +1522 -0
  172. sqlalchemy/pool/events.py +375 -0
  173. sqlalchemy/pool/impl.py +582 -0
  174. sqlalchemy/py.typed +0 -0
  175. sqlalchemy/schema.py +74 -0
  176. sqlalchemy/sql/__init__.py +156 -0
  177. sqlalchemy/sql/_annotated_cols.py +397 -0
  178. sqlalchemy/sql/_dml_constructors.py +132 -0
  179. sqlalchemy/sql/_elements_constructors.py +2164 -0
  180. sqlalchemy/sql/_orm_types.py +20 -0
  181. sqlalchemy/sql/_selectable_constructors.py +840 -0
  182. sqlalchemy/sql/_typing.py +487 -0
  183. sqlalchemy/sql/_util_cy.cp313t-win_arm64.pyd +0 -0
  184. sqlalchemy/sql/_util_cy.py +127 -0
  185. sqlalchemy/sql/annotation.py +590 -0
  186. sqlalchemy/sql/base.py +2699 -0
  187. sqlalchemy/sql/cache_key.py +1066 -0
  188. sqlalchemy/sql/coercions.py +1373 -0
  189. sqlalchemy/sql/compiler.py +8327 -0
  190. sqlalchemy/sql/crud.py +1815 -0
  191. sqlalchemy/sql/ddl.py +1928 -0
  192. sqlalchemy/sql/default_comparator.py +654 -0
  193. sqlalchemy/sql/dml.py +1977 -0
  194. sqlalchemy/sql/elements.py +6033 -0
  195. sqlalchemy/sql/events.py +458 -0
  196. sqlalchemy/sql/expression.py +172 -0
  197. sqlalchemy/sql/functions.py +2305 -0
  198. sqlalchemy/sql/lambdas.py +1443 -0
  199. sqlalchemy/sql/naming.py +209 -0
  200. sqlalchemy/sql/operators.py +2897 -0
  201. sqlalchemy/sql/roles.py +332 -0
  202. sqlalchemy/sql/schema.py +6703 -0
  203. sqlalchemy/sql/selectable.py +7553 -0
  204. sqlalchemy/sql/sqltypes.py +4093 -0
  205. sqlalchemy/sql/traversals.py +1042 -0
  206. sqlalchemy/sql/type_api.py +2446 -0
  207. sqlalchemy/sql/util.py +1495 -0
  208. sqlalchemy/sql/visitors.py +1157 -0
  209. sqlalchemy/testing/__init__.py +96 -0
  210. sqlalchemy/testing/assertions.py +1007 -0
  211. sqlalchemy/testing/assertsql.py +519 -0
  212. sqlalchemy/testing/asyncio.py +128 -0
  213. sqlalchemy/testing/config.py +440 -0
  214. sqlalchemy/testing/engines.py +483 -0
  215. sqlalchemy/testing/entities.py +117 -0
  216. sqlalchemy/testing/exclusions.py +476 -0
  217. sqlalchemy/testing/fixtures/__init__.py +30 -0
  218. sqlalchemy/testing/fixtures/base.py +384 -0
  219. sqlalchemy/testing/fixtures/mypy.py +247 -0
  220. sqlalchemy/testing/fixtures/orm.py +227 -0
  221. sqlalchemy/testing/fixtures/sql.py +538 -0
  222. sqlalchemy/testing/pickleable.py +155 -0
  223. sqlalchemy/testing/plugin/__init__.py +6 -0
  224. sqlalchemy/testing/plugin/bootstrap.py +51 -0
  225. sqlalchemy/testing/plugin/plugin_base.py +828 -0
  226. sqlalchemy/testing/plugin/pytestplugin.py +892 -0
  227. sqlalchemy/testing/profiling.py +329 -0
  228. sqlalchemy/testing/provision.py +613 -0
  229. sqlalchemy/testing/requirements.py +1978 -0
  230. sqlalchemy/testing/schema.py +198 -0
  231. sqlalchemy/testing/suite/__init__.py +19 -0
  232. sqlalchemy/testing/suite/test_cte.py +237 -0
  233. sqlalchemy/testing/suite/test_ddl.py +420 -0
  234. sqlalchemy/testing/suite/test_dialect.py +776 -0
  235. sqlalchemy/testing/suite/test_insert.py +630 -0
  236. sqlalchemy/testing/suite/test_reflection.py +3557 -0
  237. sqlalchemy/testing/suite/test_results.py +660 -0
  238. sqlalchemy/testing/suite/test_rowcount.py +258 -0
  239. sqlalchemy/testing/suite/test_select.py +2112 -0
  240. sqlalchemy/testing/suite/test_sequence.py +317 -0
  241. sqlalchemy/testing/suite/test_table_via_select.py +686 -0
  242. sqlalchemy/testing/suite/test_types.py +2271 -0
  243. sqlalchemy/testing/suite/test_unicode_ddl.py +189 -0
  244. sqlalchemy/testing/suite/test_update_delete.py +139 -0
  245. sqlalchemy/testing/util.py +535 -0
  246. sqlalchemy/testing/warnings.py +52 -0
  247. sqlalchemy/types.py +76 -0
  248. sqlalchemy/util/__init__.py +158 -0
  249. sqlalchemy/util/_collections.py +688 -0
  250. sqlalchemy/util/_collections_cy.cp313t-win_arm64.pyd +0 -0
  251. sqlalchemy/util/_collections_cy.pxd +8 -0
  252. sqlalchemy/util/_collections_cy.py +516 -0
  253. sqlalchemy/util/_has_cython.py +46 -0
  254. sqlalchemy/util/_immutabledict_cy.cp313t-win_arm64.pyd +0 -0
  255. sqlalchemy/util/_immutabledict_cy.py +240 -0
  256. sqlalchemy/util/compat.py +299 -0
  257. sqlalchemy/util/concurrency.py +322 -0
  258. sqlalchemy/util/cython.py +79 -0
  259. sqlalchemy/util/deprecations.py +401 -0
  260. sqlalchemy/util/langhelpers.py +2320 -0
  261. sqlalchemy/util/preloaded.py +152 -0
  262. sqlalchemy/util/queue.py +304 -0
  263. sqlalchemy/util/tool_support.py +201 -0
  264. sqlalchemy/util/topological.py +120 -0
  265. sqlalchemy/util/typing.py +711 -0
  266. sqlalchemy-2.1.0b2.dist-info/METADATA +269 -0
  267. sqlalchemy-2.1.0b2.dist-info/RECORD +270 -0
  268. sqlalchemy-2.1.0b2.dist-info/WHEEL +5 -0
  269. sqlalchemy-2.1.0b2.dist-info/licenses/LICENSE +19 -0
  270. sqlalchemy-2.1.0b2.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,172 @@
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 aggregate_order_by as aggregate_order_by
17
+ from ._elements_constructors import all_ as all_
18
+ from ._elements_constructors import and_ as and_
19
+ from ._elements_constructors import any_ as any_
20
+ from ._elements_constructors import asc as asc
21
+ from ._elements_constructors import between as between
22
+ from ._elements_constructors import bindparam as bindparam
23
+ from ._elements_constructors import bitwise_not as bitwise_not
24
+ from ._elements_constructors import case as case
25
+ from ._elements_constructors import cast as cast
26
+ from ._elements_constructors import collate as collate
27
+ from ._elements_constructors import column as column
28
+ from ._elements_constructors import desc as desc
29
+ from ._elements_constructors import distinct as distinct
30
+ from ._elements_constructors import extract as extract
31
+ from ._elements_constructors import false as false
32
+ from ._elements_constructors import from_dml_column as from_dml_column
33
+ from ._elements_constructors import funcfilter as funcfilter
34
+ from ._elements_constructors import label as label
35
+ from ._elements_constructors import not_ as not_
36
+ from ._elements_constructors import null as null
37
+ from ._elements_constructors import nulls_first as nulls_first
38
+ from ._elements_constructors import nulls_last as nulls_last
39
+ from ._elements_constructors import or_ as or_
40
+ from ._elements_constructors import outparam as outparam
41
+ from ._elements_constructors import over as over
42
+ from ._elements_constructors import text as text
43
+ from ._elements_constructors import true as true
44
+ from ._elements_constructors import try_cast as try_cast
45
+ from ._elements_constructors import tstring as tstring
46
+ from ._elements_constructors import tuple_ as tuple_
47
+ from ._elements_constructors import type_coerce as type_coerce
48
+ from ._elements_constructors import within_group as within_group
49
+ from ._selectable_constructors import alias as alias
50
+ from ._selectable_constructors import cte as cte
51
+ from ._selectable_constructors import except_ as except_
52
+ from ._selectable_constructors import except_all as except_all
53
+ from ._selectable_constructors import exists as exists
54
+ from ._selectable_constructors import intersect as intersect
55
+ from ._selectable_constructors import intersect_all as intersect_all
56
+ from ._selectable_constructors import join as join
57
+ from ._selectable_constructors import lateral as lateral
58
+ from ._selectable_constructors import outerjoin as outerjoin
59
+ from ._selectable_constructors import select as select
60
+ from ._selectable_constructors import table as table
61
+ from ._selectable_constructors import tablesample as tablesample
62
+ from ._selectable_constructors import union as union
63
+ from ._selectable_constructors import union_all as union_all
64
+ from ._selectable_constructors import values as values
65
+ from ._typing import ColumnExpressionArgument as ColumnExpressionArgument
66
+ from .base import _from_objects as _from_objects
67
+ from .base import _select_iterables as _select_iterables
68
+ from .base import ColumnCollection as ColumnCollection
69
+ from .base import Executable as Executable
70
+ from .base import ExecutableStatement as ExecutableStatement
71
+ from .base import WriteableColumnCollection as WriteableColumnCollection
72
+ from .cache_key import CacheKey as CacheKey
73
+ from .dml import Delete as Delete
74
+ from .dml import Insert as Insert
75
+ from .dml import Update as Update
76
+ from .dml import UpdateBase as UpdateBase
77
+ from .dml import ValuesBase as ValuesBase
78
+ from .elements import _truncated_label as _truncated_label
79
+ from .elements import AggregateOrderBy as AggregateOrderBy
80
+ from .elements import BinaryExpression as BinaryExpression
81
+ from .elements import BindParameter as BindParameter
82
+ from .elements import BooleanClauseList as BooleanClauseList
83
+ from .elements import Case as Case
84
+ from .elements import Cast as Cast
85
+ from .elements import ClauseElement as ClauseElement
86
+ from .elements import ClauseList as ClauseList
87
+ from .elements import CollectionAggregate as CollectionAggregate
88
+ from .elements import ColumnClause as ColumnClause
89
+ from .elements import ColumnElement as ColumnElement
90
+ from .elements import DMLTargetCopy as DMLTargetCopy
91
+ from .elements import ExpressionClauseList as ExpressionClauseList
92
+ from .elements import Extract as Extract
93
+ from .elements import False_ as False_
94
+ from .elements import FrameClause as FrameClause
95
+ from .elements import FrameClauseType as FrameClauseType
96
+ from .elements import FunctionFilter as FunctionFilter
97
+ from .elements import Grouping as Grouping
98
+ from .elements import Label as Label
99
+ from .elements import literal as literal
100
+ from .elements import literal_column as literal_column
101
+ from .elements import Null as Null
102
+ from .elements import OrderByList as OrderByList
103
+ from .elements import Over as Over
104
+ from .elements import quoted_name as quoted_name
105
+ from .elements import ReleaseSavepointClause as ReleaseSavepointClause
106
+ from .elements import RollbackToSavepointClause as RollbackToSavepointClause
107
+ from .elements import SavepointClause as SavepointClause
108
+ from .elements import SQLColumnExpression as SQLColumnExpression
109
+ from .elements import TableValuedColumn as TableValuedColumn
110
+ from .elements import TextClause as TextClause
111
+ from .elements import True_ as True_
112
+ from .elements import TryCast as TryCast
113
+ from .elements import TString as TString
114
+ from .elements import Tuple as Tuple
115
+ from .elements import TypeClause as TypeClause
116
+ from .elements import TypeCoerce as TypeCoerce
117
+ from .elements import UnaryExpression as UnaryExpression
118
+ from .elements import WithinGroup as WithinGroup
119
+ from .functions import func as func
120
+ from .functions import Function as Function
121
+ from .functions import FunctionElement as FunctionElement
122
+ from .functions import modifier as modifier
123
+ from .lambdas import lambda_stmt as lambda_stmt
124
+ from .lambdas import LambdaElement as LambdaElement
125
+ from .lambdas import StatementLambdaElement as StatementLambdaElement
126
+ from .operators import ColumnOperators as ColumnOperators
127
+ from .operators import custom_op as custom_op
128
+ from .operators import OperatorClass as OperatorClass
129
+ from .operators import Operators as Operators
130
+ from .selectable import Alias as Alias
131
+ from .selectable import AliasedReturnsRows as AliasedReturnsRows
132
+ from .selectable import CompoundSelect as CompoundSelect
133
+ from .selectable import CTE as CTE
134
+ from .selectable import Exists as Exists
135
+ from .selectable import FromClause as FromClause
136
+ from .selectable import FromGrouping as FromGrouping
137
+ from .selectable import GenerativeSelect as GenerativeSelect
138
+ from .selectable import HasCTE as HasCTE
139
+ from .selectable import HasPrefixes as HasPrefixes
140
+ from .selectable import HasSuffixes as HasSuffixes
141
+ from .selectable import Join as Join
142
+ from .selectable import LABEL_STYLE_DEFAULT as LABEL_STYLE_DEFAULT
143
+ from .selectable import (
144
+ LABEL_STYLE_DISAMBIGUATE_ONLY as LABEL_STYLE_DISAMBIGUATE_ONLY,
145
+ )
146
+ from .selectable import LABEL_STYLE_NONE as LABEL_STYLE_NONE
147
+ from .selectable import (
148
+ LABEL_STYLE_TABLENAME_PLUS_COL as LABEL_STYLE_TABLENAME_PLUS_COL,
149
+ )
150
+ from .selectable import Lateral as Lateral
151
+ from .selectable import ReturnsRows as ReturnsRows
152
+ from .selectable import ScalarSelect as ScalarSelect
153
+ from .selectable import ScalarValues as ScalarValues
154
+ from .selectable import Select as Select
155
+ from .selectable import Selectable as Selectable
156
+ from .selectable import SelectBase as SelectBase
157
+ from .selectable import SelectLabelStyle as SelectLabelStyle
158
+ from .selectable import Subquery as Subquery
159
+ from .selectable import TableClause as TableClause
160
+ from .selectable import TableSample as TableSample
161
+ from .selectable import TableValuedAlias as TableValuedAlias
162
+ from .selectable import TextAsFrom as TextAsFrom
163
+ from .selectable import TextualSelect as TextualSelect
164
+ from .selectable import Values as Values
165
+ from .visitors import Visitable as Visitable
166
+
167
+ nullsfirst = nulls_first
168
+ """Synonym for the :func:`.nulls_first` function."""
169
+
170
+
171
+ nullslast = nulls_last
172
+ """Synonym for the :func:`.nulls_last` function."""