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