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,145 @@
1
+ Rules for Migrating TypeEngine classes to 0.6
2
+ ---------------------------------------------
3
+
4
+ 1. the TypeEngine classes are used for:
5
+
6
+ a. Specifying behavior which needs to occur for bind parameters
7
+ or result row columns.
8
+
9
+ b. Specifying types that are entirely specific to the database
10
+ in use and have no analogue in the sqlalchemy.types package.
11
+
12
+ c. Specifying types where there is an analogue in sqlalchemy.types,
13
+ but the database in use takes vendor-specific flags for those
14
+ types.
15
+
16
+ d. If a TypeEngine class doesn't provide any of this, it should be
17
+ *removed* from the dialect.
18
+
19
+ 2. the TypeEngine classes are *no longer* used for generating DDL. Dialects
20
+ now have a TypeCompiler subclass which uses the same visit_XXX model as
21
+ other compilers.
22
+
23
+ 3. the "ischema_names" and "colspecs" dictionaries are now required members on
24
+ the Dialect class.
25
+
26
+ 4. The names of types within dialects are now important. If a dialect-specific type
27
+ is a subclass of an existing generic type and is only provided for bind/result behavior,
28
+ the current mixed case naming can remain, i.e. _PGNumeric for Numeric - in this case,
29
+ end users would never need to use _PGNumeric directly. However, if a dialect-specific
30
+ type is specifying a type *or* arguments that are not present generically, it should
31
+ match the real name of the type on that backend, in uppercase. E.g. postgresql.INET,
32
+ mysql.ENUM, postgresql.ARRAY.
33
+
34
+ Or follow this handy flowchart:
35
+
36
+ is the type meant to provide bind/result is the type the same name as an
37
+ behavior to a generic type (i.e. MixedCase) ---- no ---> UPPERCASE type in types.py ?
38
+ type in types.py ? | |
39
+ | no yes
40
+ yes | |
41
+ | | does your type need special
42
+ | +<--- yes --- behavior or arguments ?
43
+ | | |
44
+ | | no
45
+ name the type using | |
46
+ _MixedCase, i.e. v V
47
+ _OracleBoolean. it name the type don't make a
48
+ stays private to the dialect identically as that type, make sure the dialect's
49
+ and is invoked *only* via within the DB, base.py imports the types.py
50
+ the colspecs dict. using UPPERCASE UPPERCASE name into its namespace
51
+ | (i.e. BIT, NCHAR, INTERVAL).
52
+ | Users can import it.
53
+ | |
54
+ v v
55
+ subclass the closest is the name of this type
56
+ MixedCase type types.py, identical to an UPPERCASE
57
+ i.e. <--- no ------- name in types.py ?
58
+ class _DateTime(types.DateTime),
59
+ class DATETIME2(types.DateTime), |
60
+ class BIT(types.TypeEngine). yes
61
+ |
62
+ v
63
+ the type should
64
+ subclass the
65
+ UPPERCASE
66
+ type in types.py
67
+ (i.e. class BLOB(types.BLOB))
68
+
69
+
70
+ Example 1. pysqlite needs bind/result processing for the DateTime type in types.py,
71
+ which applies to all DateTimes and subclasses. It's named _SLDateTime and
72
+ subclasses types.DateTime.
73
+
74
+ Example 2. MS-SQL has a TIME type which takes a non-standard "precision" argument
75
+ that is rendered within DDL. So it's named TIME in the MS-SQL dialect's base.py,
76
+ and subclasses types.TIME. Users can then say mssql.TIME(precision=10).
77
+
78
+ Example 3. MS-SQL dialects also need special bind/result processing for date
79
+ But its DATE type doesn't render DDL differently than that of a plain
80
+ DATE, i.e. it takes no special arguments. Therefore we are just adding behavior
81
+ to types.Date, so it's named _MSDate in the MS-SQL dialect's base.py, and subclasses
82
+ types.Date.
83
+
84
+ Example 4. MySQL has a SET type, there's no analogue for this in types.py. So
85
+ MySQL names it SET in the dialect's base.py, and it subclasses types.String, since
86
+ it ultimately deals with strings.
87
+
88
+ Example 5. PostgreSQL has a DATETIME type. The DBAPIs handle dates correctly,
89
+ and no special arguments are used in PG's DDL beyond what types.py provides.
90
+ PostgreSQL dialect therefore imports types.DATETIME into its base.py.
91
+
92
+ Ideally one should be able to specify a schema using names imported completely from a
93
+ dialect, all matching the real name on that backend:
94
+
95
+ from sqlalchemy.dialects.postgresql import base as pg
96
+
97
+ t = Table('mytable', metadata,
98
+ Column('id', pg.INTEGER, primary_key=True),
99
+ Column('name', pg.VARCHAR(300)),
100
+ Column('inetaddr', pg.INET)
101
+ )
102
+
103
+ where above, the INTEGER and VARCHAR types are ultimately from sqlalchemy.types,
104
+ but the PG dialect makes them available in its own namespace.
105
+
106
+ 5. "colspecs" now is a dictionary of generic or uppercased types from sqlalchemy.types
107
+ linked to types specified in the dialect. Again, if a type in the dialect does not
108
+ specify any special behavior for bind_processor() or result_processor() and does not
109
+ indicate a special type only available in this database, it must be *removed* from the
110
+ module and from this dictionary.
111
+
112
+ 6. "ischema_names" indicates string descriptions of types as returned from the database
113
+ linked to TypeEngine classes.
114
+
115
+ a. The string name should be matched to the most specific type possible within
116
+ sqlalchemy.types, unless there is no matching type within sqlalchemy.types in which
117
+ case it points to a dialect type. *It doesn't matter* if the dialect has its
118
+ own subclass of that type with special bind/result behavior - reflect to the types.py
119
+ UPPERCASE type as much as possible. With very few exceptions, all types
120
+ should reflect to an UPPERCASE type.
121
+
122
+ b. If the dialect contains a matching dialect-specific type that takes extra arguments
123
+ which the generic one does not, then point to the dialect-specific type. E.g.
124
+ mssql.VARCHAR takes a "collation" parameter which should be preserved.
125
+
126
+ 5. DDL, or what was formerly issued by "get_col_spec()", is now handled exclusively by
127
+ a subclass of compiler.GenericTypeCompiler.
128
+
129
+ a. your TypeCompiler class will receive generic and uppercase types from
130
+ sqlalchemy.types. Do not assume the presence of dialect-specific attributes on
131
+ these types.
132
+
133
+ b. the visit_UPPERCASE methods on GenericTypeCompiler should *not* be overridden with
134
+ methods that produce a different DDL name. Uppercase types don't do any kind of
135
+ "guessing" - if visit_TIMESTAMP is called, the DDL should render as TIMESTAMP in
136
+ all cases, regardless of whether or not that type is legal on the backend database.
137
+
138
+ c. the visit_UPPERCASE methods *should* be overridden with methods that add additional
139
+ arguments and flags to those types.
140
+
141
+ d. the visit_lowercase methods are overridden to provide an interpretation of a generic
142
+ type. E.g. visit_large_binary() might be overridden to say "return self.visit_BIT(type_)".
143
+
144
+ e. visit_lowercase methods should *never* render strings directly - it should always
145
+ be via calling a visit_UPPERCASE() method.
@@ -0,0 +1,62 @@
1
+ # engine/__init__.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
+ """SQL connections, SQL execution and high-level DB-API interface.
9
+
10
+ The engine package defines the basic components used to interface
11
+ DB-API modules with higher-level statement construction,
12
+ connection-management, execution and result contexts. The primary
13
+ "entry point" class into this package is the Engine and its public
14
+ constructor ``create_engine()``.
15
+
16
+ """
17
+
18
+ from . import events as events
19
+ from . import util as util
20
+ from .base import Connection as Connection
21
+ from .base import Engine as Engine
22
+ from .base import NestedTransaction as NestedTransaction
23
+ from .base import RootTransaction as RootTransaction
24
+ from .base import Transaction as Transaction
25
+ from .base import TwoPhaseTransaction as TwoPhaseTransaction
26
+ from .create import create_engine as create_engine
27
+ from .create import create_pool_from_url as create_pool_from_url
28
+ from .create import engine_from_config as engine_from_config
29
+ from .cursor import CursorResult as CursorResult
30
+ from .cursor import ResultProxy as ResultProxy
31
+ from .interfaces import AdaptedConnection as AdaptedConnection
32
+ from .interfaces import BindTyping as BindTyping
33
+ from .interfaces import Compiled as Compiled
34
+ from .interfaces import Connectable as Connectable
35
+ from .interfaces import ConnectArgsType as ConnectArgsType
36
+ from .interfaces import ConnectionEventsTarget as ConnectionEventsTarget
37
+ from .interfaces import CreateEnginePlugin as CreateEnginePlugin
38
+ from .interfaces import Dialect as Dialect
39
+ from .interfaces import ExceptionContext as ExceptionContext
40
+ from .interfaces import ExecutionContext as ExecutionContext
41
+ from .interfaces import TypeCompiler as TypeCompiler
42
+ from .mock import create_mock_engine as create_mock_engine
43
+ from .reflection import Inspector as Inspector
44
+ from .reflection import ObjectKind as ObjectKind
45
+ from .reflection import ObjectScope as ObjectScope
46
+ from .result import ChunkedIteratorResult as ChunkedIteratorResult
47
+ from .result import FilterResult as FilterResult
48
+ from .result import FrozenResult as FrozenResult
49
+ from .result import IteratorResult as IteratorResult
50
+ from .result import MappingResult as MappingResult
51
+ from .result import MergedResult as MergedResult
52
+ from .result import Result as Result
53
+ from .result import result_tuple as result_tuple
54
+ from .result import ScalarResult as ScalarResult
55
+ from .result import TupleResult as TupleResult
56
+ from .row import BaseRow as BaseRow
57
+ from .row import Row as Row
58
+ from .row import RowMapping as RowMapping
59
+ from .url import make_url as make_url
60
+ from .url import URL as URL
61
+ from .util import connection_memoize as connection_memoize
62
+ from ..sql import ddl as ddl
@@ -0,0 +1,92 @@
1
+ # engine/_processors_cy.py
2
+ # Copyright (C) 2010-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: disable-error-code="misc, untyped-decorator"
8
+ from __future__ import annotations
9
+
10
+ from datetime import date as date_cls
11
+ from datetime import datetime as datetime_cls
12
+ from datetime import time as time_cls
13
+ from typing import Any
14
+ from typing import Optional
15
+
16
+ # START GENERATED CYTHON IMPORT
17
+ # This section is automatically generated by the script tools/cython_imports.py
18
+ try:
19
+ # NOTE: the cython compiler needs this "import cython" in the file, it
20
+ # can't be only "from sqlalchemy.util import cython" with the fallback
21
+ # in that module
22
+ import cython
23
+ except ModuleNotFoundError:
24
+ from sqlalchemy.util import cython
25
+
26
+
27
+ def _is_compiled() -> bool:
28
+ """Utility function to indicate if this module is compiled or not."""
29
+ return cython.compiled # type: ignore[no-any-return,unused-ignore]
30
+
31
+
32
+ # END GENERATED CYTHON IMPORT
33
+
34
+
35
+ @cython.annotation_typing(False)
36
+ def int_to_boolean(value: Any) -> Optional[bool]:
37
+ if value is None:
38
+ return None
39
+ return True if value else False
40
+
41
+
42
+ @cython.annotation_typing(False)
43
+ def to_str(value: Any) -> Optional[str]:
44
+ if value is None:
45
+ return None
46
+ return str(value)
47
+
48
+
49
+ @cython.annotation_typing(False)
50
+ def to_float(value: Any) -> Optional[float]:
51
+ if value is None:
52
+ return None
53
+ return float(value)
54
+
55
+
56
+ @cython.annotation_typing(False)
57
+ def str_to_datetime(value: Optional[str]) -> Optional[datetime_cls]:
58
+ if value is None:
59
+ return None
60
+ return datetime_cls.fromisoformat(value)
61
+
62
+
63
+ @cython.annotation_typing(False)
64
+ def str_to_time(value: Optional[str]) -> Optional[time_cls]:
65
+ if value is None:
66
+ return None
67
+ return time_cls.fromisoformat(value)
68
+
69
+
70
+ @cython.annotation_typing(False)
71
+ def str_to_date(value: Optional[str]) -> Optional[date_cls]:
72
+ if value is None:
73
+ return None
74
+ return date_cls.fromisoformat(value)
75
+
76
+
77
+ @cython.cclass
78
+ class to_decimal_processor_factory:
79
+ type_: type
80
+ format_: str
81
+
82
+ __slots__ = ("type_", "format_")
83
+
84
+ def __init__(self, type_: type, scale: int):
85
+ self.type_ = type_
86
+ self.format_ = f"%.{scale}f"
87
+
88
+ def __call__(self, value: Optional[Any]) -> object:
89
+ if value is None:
90
+ return None
91
+ else:
92
+ return self.type_(self.format_ % value)