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,420 @@
1
+ # testing/suite/test_ddl.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
+ # mypy: ignore-errors
8
+
9
+ import random
10
+
11
+ from . import testing
12
+ from .. import config
13
+ from .. import fixtures
14
+ from .. import util
15
+ from ..assertions import eq_
16
+ from ..assertions import is_false
17
+ from ..assertions import is_true
18
+ from ..config import requirements
19
+ from ..schema import Table
20
+ from ... import CheckConstraint
21
+ from ... import Column
22
+ from ... import ForeignKeyConstraint
23
+ from ... import Index
24
+ from ... import inspect
25
+ from ... import Integer
26
+ from ... import schema
27
+ from ... import String
28
+ from ... import UniqueConstraint
29
+
30
+
31
+ class TableDDLTest(fixtures.TestBase):
32
+ __sparse_driver_backend__ = True
33
+
34
+ def _simple_fixture(self, schema=None):
35
+ return Table(
36
+ "test_table",
37
+ self.metadata,
38
+ Column("id", Integer, primary_key=True, autoincrement=False),
39
+ Column("data", String(50)),
40
+ schema=schema,
41
+ )
42
+
43
+ def _underscore_fixture(self):
44
+ return Table(
45
+ "_test_table",
46
+ self.metadata,
47
+ Column("id", Integer, primary_key=True, autoincrement=False),
48
+ Column("_data", String(50)),
49
+ )
50
+
51
+ def _table_index_fixture(self, schema=None):
52
+ table = self._simple_fixture(schema=schema)
53
+ idx = Index("test_index", table.c.data)
54
+ return table, idx
55
+
56
+ def _simple_roundtrip(self, table):
57
+ with config.db.begin() as conn:
58
+ conn.execute(table.insert().values((1, "some data")))
59
+ result = conn.execute(table.select())
60
+ eq_(result.first(), (1, "some data"))
61
+
62
+ @requirements.create_table
63
+ @util.provide_metadata
64
+ def test_create_table(self):
65
+ table = self._simple_fixture()
66
+ table.create(config.db, checkfirst=False)
67
+ self._simple_roundtrip(table)
68
+
69
+ @requirements.create_table
70
+ @requirements.schemas
71
+ @util.provide_metadata
72
+ def test_create_table_schema(self):
73
+ table = self._simple_fixture(schema=config.test_schema)
74
+ table.create(config.db, checkfirst=False)
75
+ self._simple_roundtrip(table)
76
+
77
+ @requirements.drop_table
78
+ @util.provide_metadata
79
+ def test_drop_table(self):
80
+ table = self._simple_fixture()
81
+ table.create(config.db, checkfirst=False)
82
+ table.drop(config.db, checkfirst=False)
83
+
84
+ @requirements.create_table
85
+ @util.provide_metadata
86
+ def test_underscore_names(self):
87
+ table = self._underscore_fixture()
88
+ table.create(config.db, checkfirst=False)
89
+ self._simple_roundtrip(table)
90
+
91
+ @requirements.comment_reflection
92
+ @util.provide_metadata
93
+ def test_add_table_comment(self, connection):
94
+ table = self._simple_fixture()
95
+ table.create(connection, checkfirst=False)
96
+ table.comment = "a comment"
97
+ connection.execute(schema.SetTableComment(table))
98
+ eq_(
99
+ inspect(connection).get_table_comment("test_table"),
100
+ {"text": "a comment"},
101
+ )
102
+
103
+ @requirements.comment_reflection
104
+ @util.provide_metadata
105
+ def test_drop_table_comment(self, connection):
106
+ table = self._simple_fixture()
107
+ table.create(connection, checkfirst=False)
108
+ table.comment = "a comment"
109
+ connection.execute(schema.SetTableComment(table))
110
+ connection.execute(schema.DropTableComment(table))
111
+ eq_(
112
+ inspect(connection).get_table_comment("test_table"), {"text": None}
113
+ )
114
+
115
+ @requirements.table_ddl_if_exists
116
+ @util.provide_metadata
117
+ def test_create_table_if_not_exists(self, connection):
118
+ table = self._simple_fixture()
119
+
120
+ connection.execute(schema.CreateTable(table, if_not_exists=True))
121
+
122
+ is_true(inspect(connection).has_table("test_table"))
123
+ connection.execute(schema.CreateTable(table, if_not_exists=True))
124
+
125
+ @requirements.table_ddl_if_exists
126
+ @util.provide_metadata
127
+ def test_create_table_if_not_exists_via_create(self, connection):
128
+ table = self._simple_fixture()
129
+
130
+ table.set_creator_ddl(schema.CreateTable(table, if_not_exists=True))
131
+
132
+ table.create(connection, checkfirst=False)
133
+
134
+ is_true(inspect(connection).has_table("test_table"))
135
+
136
+ # works!
137
+ table.create(connection, checkfirst=False)
138
+
139
+ @requirements.index_ddl_if_exists
140
+ @util.provide_metadata
141
+ def test_create_index_if_not_exists(self, connection):
142
+ table, idx = self._table_index_fixture()
143
+
144
+ connection.execute(schema.CreateTable(table, if_not_exists=True))
145
+ is_true(inspect(connection).has_table("test_table"))
146
+ is_false(
147
+ "test_index"
148
+ in [
149
+ ix["name"]
150
+ for ix in inspect(connection).get_indexes("test_table")
151
+ ]
152
+ )
153
+
154
+ connection.execute(schema.CreateIndex(idx, if_not_exists=True))
155
+
156
+ is_true(
157
+ "test_index"
158
+ in [
159
+ ix["name"]
160
+ for ix in inspect(connection).get_indexes("test_table")
161
+ ]
162
+ )
163
+
164
+ connection.execute(schema.CreateIndex(idx, if_not_exists=True))
165
+
166
+ @requirements.table_ddl_if_exists
167
+ @util.provide_metadata
168
+ def test_drop_table_if_exists(self, connection):
169
+ table = self._simple_fixture()
170
+
171
+ table.create(connection)
172
+
173
+ is_true(inspect(connection).has_table("test_table"))
174
+
175
+ connection.execute(schema.DropTable(table, if_exists=True))
176
+
177
+ is_false(inspect(connection).has_table("test_table"))
178
+
179
+ connection.execute(schema.DropTable(table, if_exists=True))
180
+
181
+ @requirements.table_ddl_if_exists
182
+ @util.provide_metadata
183
+ def test_drop_table_if_exists_via_drop(self, connection):
184
+ table = self._simple_fixture()
185
+
186
+ table.create(connection)
187
+
188
+ is_true(inspect(connection).has_table("test_table"))
189
+
190
+ table.set_dropper_ddl(schema.DropTable(table, if_exists=True))
191
+ table.drop(connection, checkfirst=False)
192
+
193
+ is_false(inspect(connection).has_table("test_table"))
194
+
195
+ # works!!
196
+ table.drop(connection, checkfirst=False)
197
+
198
+ @requirements.index_ddl_if_exists
199
+ @util.provide_metadata
200
+ def test_drop_index_if_exists(self, connection):
201
+ table, idx = self._table_index_fixture()
202
+
203
+ table.create(connection)
204
+
205
+ is_true(
206
+ "test_index"
207
+ in [
208
+ ix["name"]
209
+ for ix in inspect(connection).get_indexes("test_table")
210
+ ]
211
+ )
212
+
213
+ connection.execute(schema.DropIndex(idx, if_exists=True))
214
+
215
+ is_false(
216
+ "test_index"
217
+ in [
218
+ ix["name"]
219
+ for ix in inspect(connection).get_indexes("test_table")
220
+ ]
221
+ )
222
+
223
+ connection.execute(schema.DropIndex(idx, if_exists=True))
224
+
225
+
226
+ class FutureTableDDLTest(fixtures.FutureEngineMixin, TableDDLTest):
227
+ pass
228
+
229
+
230
+ class LongNameBlowoutTest(fixtures.TestBase):
231
+ """test the creation of a variety of DDL structures and ensure
232
+ label length limits pass on backends
233
+
234
+ """
235
+
236
+ __sparse_driver_backend__ = True
237
+
238
+ def fk(self, metadata, connection):
239
+ convention = {
240
+ "fk": "foreign_key_%(table_name)s_"
241
+ "%(column_0_N_name)s_"
242
+ "%(referred_table_name)s_"
243
+ + (
244
+ "_".join(
245
+ "".join(random.choice("abcdef") for j in range(20))
246
+ for i in range(10)
247
+ )
248
+ ),
249
+ }
250
+ metadata.naming_convention = convention
251
+
252
+ Table(
253
+ "a_things_with_stuff",
254
+ metadata,
255
+ Column("id_long_column_name", Integer, primary_key=True),
256
+ test_needs_fk=True,
257
+ )
258
+
259
+ cons = ForeignKeyConstraint(
260
+ ["aid"], ["a_things_with_stuff.id_long_column_name"]
261
+ )
262
+ Table(
263
+ "b_related_things_of_value",
264
+ metadata,
265
+ Column(
266
+ "aid",
267
+ ),
268
+ cons,
269
+ test_needs_fk=True,
270
+ )
271
+ actual_name = cons.name
272
+
273
+ metadata.create_all(connection)
274
+
275
+ if testing.requires.foreign_key_constraint_name_reflection.enabled:
276
+ insp = inspect(connection)
277
+ fks = insp.get_foreign_keys("b_related_things_of_value")
278
+ reflected_name = fks[0]["name"]
279
+
280
+ return actual_name, reflected_name
281
+ else:
282
+ return actual_name, None
283
+
284
+ def pk(self, metadata, connection):
285
+ convention = {
286
+ "pk": "primary_key_%(table_name)s_"
287
+ "%(column_0_N_name)s"
288
+ + (
289
+ "_".join(
290
+ "".join(random.choice("abcdef") for j in range(30))
291
+ for i in range(10)
292
+ )
293
+ ),
294
+ }
295
+ metadata.naming_convention = convention
296
+
297
+ a = Table(
298
+ "a_things_with_stuff",
299
+ metadata,
300
+ Column("id_long_column_name", Integer, primary_key=True),
301
+ Column("id_another_long_name", Integer, primary_key=True),
302
+ )
303
+ cons = a.primary_key
304
+ actual_name = cons.name
305
+
306
+ metadata.create_all(connection)
307
+ insp = inspect(connection)
308
+ pk = insp.get_pk_constraint("a_things_with_stuff")
309
+ reflected_name = pk["name"]
310
+ return actual_name, reflected_name
311
+
312
+ def ix(self, metadata, connection):
313
+ convention = {
314
+ "ix": "index_%(table_name)s_"
315
+ "%(column_0_N_name)s"
316
+ + (
317
+ "_".join(
318
+ "".join(random.choice("abcdef") for j in range(30))
319
+ for i in range(10)
320
+ )
321
+ ),
322
+ }
323
+ metadata.naming_convention = convention
324
+
325
+ a = Table(
326
+ "a_things_with_stuff",
327
+ metadata,
328
+ Column("id_long_column_name", Integer, primary_key=True),
329
+ Column("id_another_long_name", Integer),
330
+ )
331
+ cons = Index(None, a.c.id_long_column_name, a.c.id_another_long_name)
332
+ actual_name = cons.name
333
+
334
+ metadata.create_all(connection)
335
+ insp = inspect(connection)
336
+ ix = insp.get_indexes("a_things_with_stuff")
337
+ reflected_name = ix[0]["name"]
338
+ return actual_name, reflected_name
339
+
340
+ def uq(self, metadata, connection):
341
+ convention = {
342
+ "uq": "unique_constraint_%(table_name)s_"
343
+ "%(column_0_N_name)s"
344
+ + (
345
+ "_".join(
346
+ "".join(random.choice("abcdef") for j in range(30))
347
+ for i in range(10)
348
+ )
349
+ ),
350
+ }
351
+ metadata.naming_convention = convention
352
+
353
+ cons = UniqueConstraint("id_long_column_name", "id_another_long_name")
354
+ Table(
355
+ "a_things_with_stuff",
356
+ metadata,
357
+ Column("id_long_column_name", Integer, primary_key=True),
358
+ Column("id_another_long_name", Integer),
359
+ cons,
360
+ )
361
+ actual_name = cons.name
362
+
363
+ metadata.create_all(connection)
364
+ insp = inspect(connection)
365
+ uq = insp.get_unique_constraints("a_things_with_stuff")
366
+ reflected_name = uq[0]["name"]
367
+ return actual_name, reflected_name
368
+
369
+ def ck(self, metadata, connection):
370
+ convention = {
371
+ "ck": "check_constraint_%(table_name)s"
372
+ + (
373
+ "_".join(
374
+ "".join(random.choice("abcdef") for j in range(30))
375
+ for i in range(10)
376
+ )
377
+ ),
378
+ }
379
+ metadata.naming_convention = convention
380
+
381
+ cons = CheckConstraint("some_long_column_name > 5")
382
+ Table(
383
+ "a_things_with_stuff",
384
+ metadata,
385
+ Column("id_long_column_name", Integer, primary_key=True),
386
+ Column("some_long_column_name", Integer),
387
+ cons,
388
+ )
389
+ actual_name = cons.name
390
+
391
+ metadata.create_all(connection)
392
+ insp = inspect(connection)
393
+ ck = insp.get_check_constraints("a_things_with_stuff")
394
+ reflected_name = ck[0]["name"]
395
+ return actual_name, reflected_name
396
+
397
+ @testing.combinations(
398
+ ("fk",),
399
+ ("pk",),
400
+ ("ix",),
401
+ ("ck", testing.requires.check_constraint_reflection.as_skips()),
402
+ ("uq", testing.requires.unique_constraint_reflection.as_skips()),
403
+ argnames="type_",
404
+ )
405
+ def test_long_convention_name(self, type_, metadata, connection):
406
+ actual_name, reflected_name = getattr(self, type_)(
407
+ metadata, connection
408
+ )
409
+
410
+ assert len(actual_name) > 255
411
+
412
+ if reflected_name is not None:
413
+ overlap = actual_name[0 : len(reflected_name)]
414
+ if len(overlap) < len(actual_name):
415
+ eq_(overlap[0:-5], reflected_name[0 : len(overlap) - 5])
416
+ else:
417
+ eq_(overlap, reflected_name)
418
+
419
+
420
+ __all__ = ("TableDDLTest", "FutureTableDDLTest", "LongNameBlowoutTest")