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,189 @@
1
+ # testing/suite/test_unicode_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
+
10
+ from sqlalchemy import desc
11
+ from sqlalchemy import ForeignKey
12
+ from sqlalchemy import Integer
13
+ from sqlalchemy import MetaData
14
+ from sqlalchemy import testing
15
+ from sqlalchemy.testing import eq_
16
+ from sqlalchemy.testing import fixtures
17
+ from sqlalchemy.testing.schema import Column
18
+ from sqlalchemy.testing.schema import Table
19
+
20
+
21
+ class UnicodeSchemaTest(fixtures.TablesTest):
22
+ __requires__ = ("unicode_ddl",)
23
+ __backend__ = True
24
+
25
+ @classmethod
26
+ def define_tables(cls, metadata):
27
+ global t1, t2, t3
28
+
29
+ t1 = Table(
30
+ "unitable1",
31
+ metadata,
32
+ Column("méil", Integer, primary_key=True),
33
+ Column("\u6e2c\u8a66", Integer),
34
+ test_needs_fk=True,
35
+ )
36
+ t2 = Table(
37
+ "Unitéble2",
38
+ metadata,
39
+ Column("méil", Integer, primary_key=True, key="a"),
40
+ Column(
41
+ "\u6e2c\u8a66",
42
+ Integer,
43
+ ForeignKey("unitable1.méil"),
44
+ key="b",
45
+ ),
46
+ test_needs_fk=True,
47
+ )
48
+
49
+ # Few DBs support Unicode foreign keys
50
+ if testing.against("sqlite"):
51
+ t3 = Table(
52
+ "\u6e2c\u8a66",
53
+ metadata,
54
+ Column(
55
+ "\u6e2c\u8a66_id",
56
+ Integer,
57
+ primary_key=True,
58
+ autoincrement=False,
59
+ ),
60
+ Column(
61
+ "unitable1_\u6e2c\u8a66",
62
+ Integer,
63
+ ForeignKey("unitable1.\u6e2c\u8a66"),
64
+ ),
65
+ Column("Unitéble2_b", Integer, ForeignKey("Unitéble2.b")),
66
+ Column(
67
+ "\u6e2c\u8a66_self",
68
+ Integer,
69
+ ForeignKey("\u6e2c\u8a66.\u6e2c\u8a66_id"),
70
+ ),
71
+ test_needs_fk=True,
72
+ )
73
+ else:
74
+ t3 = Table(
75
+ "\u6e2c\u8a66",
76
+ metadata,
77
+ Column(
78
+ "\u6e2c\u8a66_id",
79
+ Integer,
80
+ primary_key=True,
81
+ autoincrement=False,
82
+ ),
83
+ Column("unitable1_\u6e2c\u8a66", Integer),
84
+ Column("Unitéble2_b", Integer),
85
+ Column("\u6e2c\u8a66_self", Integer),
86
+ test_needs_fk=True,
87
+ )
88
+
89
+ def test_insert(self, connection):
90
+ connection.execute(t1.insert(), {"méil": 1, "\u6e2c\u8a66": 5})
91
+ connection.execute(t2.insert(), {"a": 1, "b": 1})
92
+ connection.execute(
93
+ t3.insert(),
94
+ {
95
+ "\u6e2c\u8a66_id": 1,
96
+ "unitable1_\u6e2c\u8a66": 5,
97
+ "Unitéble2_b": 1,
98
+ "\u6e2c\u8a66_self": 1,
99
+ },
100
+ )
101
+
102
+ eq_(connection.execute(t1.select()).fetchall(), [(1, 5)])
103
+ eq_(connection.execute(t2.select()).fetchall(), [(1, 1)])
104
+ eq_(connection.execute(t3.select()).fetchall(), [(1, 5, 1, 1)])
105
+
106
+ def test_col_targeting(self, connection):
107
+ connection.execute(t1.insert(), {"méil": 1, "\u6e2c\u8a66": 5})
108
+ connection.execute(t2.insert(), {"a": 1, "b": 1})
109
+ connection.execute(
110
+ t3.insert(),
111
+ {
112
+ "\u6e2c\u8a66_id": 1,
113
+ "unitable1_\u6e2c\u8a66": 5,
114
+ "Unitéble2_b": 1,
115
+ "\u6e2c\u8a66_self": 1,
116
+ },
117
+ )
118
+
119
+ row = connection.execute(t1.select()).first()
120
+ eq_(row._mapping[t1.c["méil"]], 1)
121
+ eq_(row._mapping[t1.c["\u6e2c\u8a66"]], 5)
122
+
123
+ row = connection.execute(t2.select()).first()
124
+ eq_(row._mapping[t2.c["a"]], 1)
125
+ eq_(row._mapping[t2.c["b"]], 1)
126
+
127
+ row = connection.execute(t3.select()).first()
128
+ eq_(row._mapping[t3.c["\u6e2c\u8a66_id"]], 1)
129
+ eq_(row._mapping[t3.c["unitable1_\u6e2c\u8a66"]], 5)
130
+ eq_(row._mapping[t3.c["Unitéble2_b"]], 1)
131
+ eq_(row._mapping[t3.c["\u6e2c\u8a66_self"]], 1)
132
+
133
+ def test_reflect(self, connection):
134
+ connection.execute(t1.insert(), {"méil": 2, "\u6e2c\u8a66": 7})
135
+ connection.execute(t2.insert(), {"a": 2, "b": 2})
136
+ connection.execute(
137
+ t3.insert(),
138
+ {
139
+ "\u6e2c\u8a66_id": 2,
140
+ "unitable1_\u6e2c\u8a66": 7,
141
+ "Unitéble2_b": 2,
142
+ "\u6e2c\u8a66_self": 2,
143
+ },
144
+ )
145
+
146
+ meta = MetaData()
147
+ tt1 = Table(t1.name, meta, autoload_with=connection)
148
+ tt2 = Table(t2.name, meta, autoload_with=connection)
149
+ tt3 = Table(t3.name, meta, autoload_with=connection)
150
+
151
+ connection.execute(tt1.insert(), {"méil": 1, "\u6e2c\u8a66": 5})
152
+ connection.execute(tt2.insert(), {"méil": 1, "\u6e2c\u8a66": 1})
153
+ connection.execute(
154
+ tt3.insert(),
155
+ {
156
+ "\u6e2c\u8a66_id": 1,
157
+ "unitable1_\u6e2c\u8a66": 5,
158
+ "Unitéble2_b": 1,
159
+ "\u6e2c\u8a66_self": 1,
160
+ },
161
+ )
162
+
163
+ eq_(
164
+ connection.execute(tt1.select().order_by(desc("méil"))).fetchall(),
165
+ [(2, 7), (1, 5)],
166
+ )
167
+ eq_(
168
+ connection.execute(tt2.select().order_by(desc("méil"))).fetchall(),
169
+ [(2, 2), (1, 1)],
170
+ )
171
+ eq_(
172
+ connection.execute(
173
+ tt3.select().order_by(desc("\u6e2c\u8a66_id"))
174
+ ).fetchall(),
175
+ [(2, 7, 2, 2), (1, 5, 1, 1)],
176
+ )
177
+
178
+ def test_repr(self):
179
+ meta = MetaData()
180
+ t = Table("\u6e2c\u8a66", meta, Column("\u6e2c\u8a66_id", Integer))
181
+ eq_(
182
+ repr(t),
183
+ (
184
+ "Table('測試', MetaData(), "
185
+ "Column('測試_id', Integer(), "
186
+ "table=<測試>), "
187
+ "schema=None)"
188
+ ),
189
+ )
@@ -0,0 +1,139 @@
1
+ # testing/suite/test_update_delete.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
+ from .. import fixtures
10
+ from ..assertions import eq_
11
+ from ..schema import Column
12
+ from ..schema import Table
13
+ from ... import Integer
14
+ from ... import String
15
+ from ... import testing
16
+
17
+
18
+ class SimpleUpdateDeleteTest(fixtures.TablesTest):
19
+ run_deletes = "each"
20
+ __requires__ = ("sane_rowcount",)
21
+ __sparse_driver_backend__ = True
22
+
23
+ @classmethod
24
+ def define_tables(cls, metadata):
25
+ Table(
26
+ "plain_pk",
27
+ metadata,
28
+ Column("id", Integer, primary_key=True),
29
+ Column("data", String(50)),
30
+ )
31
+
32
+ @classmethod
33
+ def insert_data(cls, connection):
34
+ connection.execute(
35
+ cls.tables.plain_pk.insert(),
36
+ [
37
+ {"id": 1, "data": "d1"},
38
+ {"id": 2, "data": "d2"},
39
+ {"id": 3, "data": "d3"},
40
+ ],
41
+ )
42
+
43
+ def test_update(self, connection):
44
+ t = self.tables.plain_pk
45
+ r = connection.execute(
46
+ t.update().where(t.c.id == 2), dict(data="d2_new")
47
+ )
48
+ assert not r.is_insert
49
+ assert not r.returns_rows
50
+ assert r.rowcount == 1
51
+
52
+ eq_(
53
+ connection.execute(t.select().order_by(t.c.id)).fetchall(),
54
+ [(1, "d1"), (2, "d2_new"), (3, "d3")],
55
+ )
56
+
57
+ def test_delete(self, connection):
58
+ t = self.tables.plain_pk
59
+ r = connection.execute(t.delete().where(t.c.id == 2))
60
+ assert not r.is_insert
61
+ assert not r.returns_rows
62
+ assert r.rowcount == 1
63
+ eq_(
64
+ connection.execute(t.select().order_by(t.c.id)).fetchall(),
65
+ [(1, "d1"), (3, "d3")],
66
+ )
67
+
68
+ @testing.variation("criteria", ["rows", "norows", "emptyin"])
69
+ @testing.requires.update_returning
70
+ def test_update_returning(self, connection, criteria):
71
+ t = self.tables.plain_pk
72
+
73
+ stmt = t.update().returning(t.c.id, t.c.data)
74
+
75
+ if criteria.norows:
76
+ stmt = stmt.where(t.c.id == 10)
77
+ elif criteria.rows:
78
+ stmt = stmt.where(t.c.id == 2)
79
+ elif criteria.emptyin:
80
+ stmt = stmt.where(t.c.id.in_([]))
81
+ else:
82
+ criteria.fail()
83
+
84
+ r = connection.execute(stmt, dict(data="d2_new"))
85
+ assert not r.is_insert
86
+ assert r.returns_rows
87
+ eq_(r.keys(), ["id", "data"])
88
+
89
+ if criteria.rows:
90
+ eq_(r.all(), [(2, "d2_new")])
91
+ else:
92
+ eq_(r.all(), [])
93
+
94
+ eq_(
95
+ connection.execute(t.select().order_by(t.c.id)).fetchall(),
96
+ (
97
+ [(1, "d1"), (2, "d2_new"), (3, "d3")]
98
+ if criteria.rows
99
+ else [(1, "d1"), (2, "d2"), (3, "d3")]
100
+ ),
101
+ )
102
+
103
+ @testing.variation("criteria", ["rows", "norows", "emptyin"])
104
+ @testing.requires.delete_returning
105
+ def test_delete_returning(self, connection, criteria):
106
+ t = self.tables.plain_pk
107
+
108
+ stmt = t.delete().returning(t.c.id, t.c.data)
109
+
110
+ if criteria.norows:
111
+ stmt = stmt.where(t.c.id == 10)
112
+ elif criteria.rows:
113
+ stmt = stmt.where(t.c.id == 2)
114
+ elif criteria.emptyin:
115
+ stmt = stmt.where(t.c.id.in_([]))
116
+ else:
117
+ criteria.fail()
118
+
119
+ r = connection.execute(stmt)
120
+ assert not r.is_insert
121
+ assert r.returns_rows
122
+ eq_(r.keys(), ["id", "data"])
123
+
124
+ if criteria.rows:
125
+ eq_(r.all(), [(2, "d2")])
126
+ else:
127
+ eq_(r.all(), [])
128
+
129
+ eq_(
130
+ connection.execute(t.select().order_by(t.c.id)).fetchall(),
131
+ (
132
+ [(1, "d1"), (3, "d3")]
133
+ if criteria.rows
134
+ else [(1, "d1"), (2, "d2"), (3, "d3")]
135
+ ),
136
+ )
137
+
138
+
139
+ __all__ = ("SimpleUpdateDeleteTest",)