SQLAlchemy 2.0.47__cp313-cp313t-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.
- sqlalchemy/__init__.py +283 -0
- sqlalchemy/connectors/__init__.py +18 -0
- sqlalchemy/connectors/aioodbc.py +184 -0
- sqlalchemy/connectors/asyncio.py +429 -0
- sqlalchemy/connectors/pyodbc.py +250 -0
- sqlalchemy/cyextension/__init__.py +6 -0
- sqlalchemy/cyextension/collections.cp313t-win32.pyd +0 -0
- sqlalchemy/cyextension/collections.pyx +409 -0
- sqlalchemy/cyextension/immutabledict.cp313t-win32.pyd +0 -0
- sqlalchemy/cyextension/immutabledict.pxd +8 -0
- sqlalchemy/cyextension/immutabledict.pyx +133 -0
- sqlalchemy/cyextension/processors.cp313t-win32.pyd +0 -0
- sqlalchemy/cyextension/processors.pyx +68 -0
- sqlalchemy/cyextension/resultproxy.cp313t-win32.pyd +0 -0
- sqlalchemy/cyextension/resultproxy.pyx +102 -0
- sqlalchemy/cyextension/util.cp313t-win32.pyd +0 -0
- sqlalchemy/cyextension/util.pyx +90 -0
- sqlalchemy/dialects/__init__.py +62 -0
- sqlalchemy/dialects/_typing.py +30 -0
- sqlalchemy/dialects/mssql/__init__.py +88 -0
- sqlalchemy/dialects/mssql/aioodbc.py +63 -0
- sqlalchemy/dialects/mssql/base.py +4093 -0
- sqlalchemy/dialects/mssql/information_schema.py +285 -0
- sqlalchemy/dialects/mssql/json.py +129 -0
- sqlalchemy/dialects/mssql/provision.py +185 -0
- sqlalchemy/dialects/mssql/pymssql.py +126 -0
- sqlalchemy/dialects/mssql/pyodbc.py +760 -0
- sqlalchemy/dialects/mysql/__init__.py +104 -0
- sqlalchemy/dialects/mysql/aiomysql.py +250 -0
- sqlalchemy/dialects/mysql/asyncmy.py +231 -0
- sqlalchemy/dialects/mysql/base.py +3949 -0
- sqlalchemy/dialects/mysql/cymysql.py +106 -0
- sqlalchemy/dialects/mysql/dml.py +225 -0
- sqlalchemy/dialects/mysql/enumerated.py +282 -0
- sqlalchemy/dialects/mysql/expression.py +146 -0
- sqlalchemy/dialects/mysql/json.py +91 -0
- sqlalchemy/dialects/mysql/mariadb.py +72 -0
- sqlalchemy/dialects/mysql/mariadbconnector.py +322 -0
- sqlalchemy/dialects/mysql/mysqlconnector.py +302 -0
- sqlalchemy/dialects/mysql/mysqldb.py +314 -0
- sqlalchemy/dialects/mysql/provision.py +153 -0
- sqlalchemy/dialects/mysql/pymysql.py +158 -0
- sqlalchemy/dialects/mysql/pyodbc.py +157 -0
- sqlalchemy/dialects/mysql/reflection.py +727 -0
- sqlalchemy/dialects/mysql/reserved_words.py +570 -0
- sqlalchemy/dialects/mysql/types.py +835 -0
- sqlalchemy/dialects/oracle/__init__.py +81 -0
- sqlalchemy/dialects/oracle/base.py +3802 -0
- sqlalchemy/dialects/oracle/cx_oracle.py +1555 -0
- sqlalchemy/dialects/oracle/dictionary.py +507 -0
- sqlalchemy/dialects/oracle/oracledb.py +941 -0
- sqlalchemy/dialects/oracle/provision.py +297 -0
- sqlalchemy/dialects/oracle/types.py +316 -0
- sqlalchemy/dialects/oracle/vector.py +365 -0
- sqlalchemy/dialects/postgresql/__init__.py +167 -0
- sqlalchemy/dialects/postgresql/_psycopg_common.py +189 -0
- sqlalchemy/dialects/postgresql/array.py +519 -0
- sqlalchemy/dialects/postgresql/asyncpg.py +1284 -0
- sqlalchemy/dialects/postgresql/base.py +5378 -0
- sqlalchemy/dialects/postgresql/dml.py +339 -0
- sqlalchemy/dialects/postgresql/ext.py +540 -0
- sqlalchemy/dialects/postgresql/hstore.py +406 -0
- sqlalchemy/dialects/postgresql/json.py +404 -0
- sqlalchemy/dialects/postgresql/named_types.py +524 -0
- sqlalchemy/dialects/postgresql/operators.py +129 -0
- sqlalchemy/dialects/postgresql/pg8000.py +669 -0
- sqlalchemy/dialects/postgresql/pg_catalog.py +326 -0
- sqlalchemy/dialects/postgresql/provision.py +183 -0
- sqlalchemy/dialects/postgresql/psycopg.py +862 -0
- sqlalchemy/dialects/postgresql/psycopg2.py +892 -0
- sqlalchemy/dialects/postgresql/psycopg2cffi.py +61 -0
- sqlalchemy/dialects/postgresql/ranges.py +1031 -0
- sqlalchemy/dialects/postgresql/types.py +313 -0
- sqlalchemy/dialects/sqlite/__init__.py +57 -0
- sqlalchemy/dialects/sqlite/aiosqlite.py +482 -0
- sqlalchemy/dialects/sqlite/base.py +3056 -0
- sqlalchemy/dialects/sqlite/dml.py +263 -0
- sqlalchemy/dialects/sqlite/json.py +92 -0
- sqlalchemy/dialects/sqlite/provision.py +229 -0
- sqlalchemy/dialects/sqlite/pysqlcipher.py +157 -0
- sqlalchemy/dialects/sqlite/pysqlite.py +756 -0
- sqlalchemy/dialects/type_migration_guidelines.txt +145 -0
- sqlalchemy/engine/__init__.py +62 -0
- sqlalchemy/engine/_py_processors.py +136 -0
- sqlalchemy/engine/_py_row.py +128 -0
- sqlalchemy/engine/_py_util.py +74 -0
- sqlalchemy/engine/base.py +3390 -0
- sqlalchemy/engine/characteristics.py +155 -0
- sqlalchemy/engine/create.py +893 -0
- sqlalchemy/engine/cursor.py +2298 -0
- sqlalchemy/engine/default.py +2394 -0
- sqlalchemy/engine/events.py +965 -0
- sqlalchemy/engine/interfaces.py +3471 -0
- sqlalchemy/engine/mock.py +134 -0
- sqlalchemy/engine/processors.py +61 -0
- sqlalchemy/engine/reflection.py +2102 -0
- sqlalchemy/engine/result.py +2399 -0
- sqlalchemy/engine/row.py +400 -0
- sqlalchemy/engine/strategies.py +16 -0
- sqlalchemy/engine/url.py +924 -0
- sqlalchemy/engine/util.py +167 -0
- sqlalchemy/event/__init__.py +26 -0
- sqlalchemy/event/api.py +220 -0
- sqlalchemy/event/attr.py +676 -0
- sqlalchemy/event/base.py +472 -0
- sqlalchemy/event/legacy.py +258 -0
- sqlalchemy/event/registry.py +390 -0
- sqlalchemy/events.py +17 -0
- sqlalchemy/exc.py +832 -0
- sqlalchemy/ext/__init__.py +11 -0
- sqlalchemy/ext/associationproxy.py +2027 -0
- sqlalchemy/ext/asyncio/__init__.py +25 -0
- sqlalchemy/ext/asyncio/base.py +281 -0
- sqlalchemy/ext/asyncio/engine.py +1471 -0
- sqlalchemy/ext/asyncio/exc.py +21 -0
- sqlalchemy/ext/asyncio/result.py +965 -0
- sqlalchemy/ext/asyncio/scoping.py +1599 -0
- sqlalchemy/ext/asyncio/session.py +1947 -0
- sqlalchemy/ext/automap.py +1701 -0
- sqlalchemy/ext/baked.py +570 -0
- sqlalchemy/ext/compiler.py +600 -0
- sqlalchemy/ext/declarative/__init__.py +65 -0
- sqlalchemy/ext/declarative/extensions.py +564 -0
- sqlalchemy/ext/horizontal_shard.py +478 -0
- sqlalchemy/ext/hybrid.py +1535 -0
- sqlalchemy/ext/indexable.py +364 -0
- sqlalchemy/ext/instrumentation.py +450 -0
- sqlalchemy/ext/mutable.py +1085 -0
- sqlalchemy/ext/mypy/__init__.py +6 -0
- sqlalchemy/ext/mypy/apply.py +324 -0
- sqlalchemy/ext/mypy/decl_class.py +515 -0
- sqlalchemy/ext/mypy/infer.py +590 -0
- sqlalchemy/ext/mypy/names.py +335 -0
- sqlalchemy/ext/mypy/plugin.py +303 -0
- sqlalchemy/ext/mypy/util.py +357 -0
- sqlalchemy/ext/orderinglist.py +439 -0
- sqlalchemy/ext/serializer.py +185 -0
- sqlalchemy/future/__init__.py +16 -0
- sqlalchemy/future/engine.py +15 -0
- sqlalchemy/inspection.py +174 -0
- sqlalchemy/log.py +288 -0
- sqlalchemy/orm/__init__.py +171 -0
- sqlalchemy/orm/_orm_constructors.py +2661 -0
- sqlalchemy/orm/_typing.py +179 -0
- sqlalchemy/orm/attributes.py +2845 -0
- sqlalchemy/orm/base.py +971 -0
- sqlalchemy/orm/bulk_persistence.py +2135 -0
- sqlalchemy/orm/clsregistry.py +571 -0
- sqlalchemy/orm/collections.py +1627 -0
- sqlalchemy/orm/context.py +3334 -0
- sqlalchemy/orm/decl_api.py +2004 -0
- sqlalchemy/orm/decl_base.py +2192 -0
- sqlalchemy/orm/dependency.py +1302 -0
- sqlalchemy/orm/descriptor_props.py +1092 -0
- sqlalchemy/orm/dynamic.py +300 -0
- sqlalchemy/orm/evaluator.py +379 -0
- sqlalchemy/orm/events.py +3252 -0
- sqlalchemy/orm/exc.py +237 -0
- sqlalchemy/orm/identity.py +302 -0
- sqlalchemy/orm/instrumentation.py +754 -0
- sqlalchemy/orm/interfaces.py +1496 -0
- sqlalchemy/orm/loading.py +1686 -0
- sqlalchemy/orm/mapped_collection.py +557 -0
- sqlalchemy/orm/mapper.py +4444 -0
- sqlalchemy/orm/path_registry.py +809 -0
- sqlalchemy/orm/persistence.py +1788 -0
- sqlalchemy/orm/properties.py +935 -0
- sqlalchemy/orm/query.py +3459 -0
- sqlalchemy/orm/relationships.py +3508 -0
- sqlalchemy/orm/scoping.py +2148 -0
- sqlalchemy/orm/session.py +5280 -0
- sqlalchemy/orm/state.py +1168 -0
- sqlalchemy/orm/state_changes.py +196 -0
- sqlalchemy/orm/strategies.py +3470 -0
- sqlalchemy/orm/strategy_options.py +2568 -0
- sqlalchemy/orm/sync.py +164 -0
- sqlalchemy/orm/unitofwork.py +796 -0
- sqlalchemy/orm/util.py +2403 -0
- sqlalchemy/orm/writeonly.py +674 -0
- sqlalchemy/pool/__init__.py +44 -0
- sqlalchemy/pool/base.py +1524 -0
- sqlalchemy/pool/events.py +375 -0
- sqlalchemy/pool/impl.py +588 -0
- sqlalchemy/py.typed +0 -0
- sqlalchemy/schema.py +69 -0
- sqlalchemy/sql/__init__.py +145 -0
- sqlalchemy/sql/_dml_constructors.py +132 -0
- sqlalchemy/sql/_elements_constructors.py +1872 -0
- sqlalchemy/sql/_orm_types.py +20 -0
- sqlalchemy/sql/_py_util.py +75 -0
- sqlalchemy/sql/_selectable_constructors.py +763 -0
- sqlalchemy/sql/_typing.py +482 -0
- sqlalchemy/sql/annotation.py +587 -0
- sqlalchemy/sql/base.py +2293 -0
- sqlalchemy/sql/cache_key.py +1057 -0
- sqlalchemy/sql/coercions.py +1404 -0
- sqlalchemy/sql/compiler.py +8081 -0
- sqlalchemy/sql/crud.py +1752 -0
- sqlalchemy/sql/ddl.py +1444 -0
- sqlalchemy/sql/default_comparator.py +551 -0
- sqlalchemy/sql/dml.py +1850 -0
- sqlalchemy/sql/elements.py +5589 -0
- sqlalchemy/sql/events.py +458 -0
- sqlalchemy/sql/expression.py +159 -0
- sqlalchemy/sql/functions.py +2158 -0
- sqlalchemy/sql/lambdas.py +1442 -0
- sqlalchemy/sql/naming.py +209 -0
- sqlalchemy/sql/operators.py +2623 -0
- sqlalchemy/sql/roles.py +323 -0
- sqlalchemy/sql/schema.py +6222 -0
- sqlalchemy/sql/selectable.py +7265 -0
- sqlalchemy/sql/sqltypes.py +3930 -0
- sqlalchemy/sql/traversals.py +1024 -0
- sqlalchemy/sql/type_api.py +2368 -0
- sqlalchemy/sql/util.py +1485 -0
- sqlalchemy/sql/visitors.py +1164 -0
- sqlalchemy/testing/__init__.py +96 -0
- sqlalchemy/testing/assertions.py +994 -0
- sqlalchemy/testing/assertsql.py +520 -0
- sqlalchemy/testing/asyncio.py +135 -0
- sqlalchemy/testing/config.py +434 -0
- sqlalchemy/testing/engines.py +483 -0
- sqlalchemy/testing/entities.py +117 -0
- sqlalchemy/testing/exclusions.py +476 -0
- sqlalchemy/testing/fixtures/__init__.py +28 -0
- sqlalchemy/testing/fixtures/base.py +384 -0
- sqlalchemy/testing/fixtures/mypy.py +332 -0
- sqlalchemy/testing/fixtures/orm.py +227 -0
- sqlalchemy/testing/fixtures/sql.py +482 -0
- sqlalchemy/testing/pickleable.py +155 -0
- sqlalchemy/testing/plugin/__init__.py +6 -0
- sqlalchemy/testing/plugin/bootstrap.py +51 -0
- sqlalchemy/testing/plugin/plugin_base.py +828 -0
- sqlalchemy/testing/plugin/pytestplugin.py +892 -0
- sqlalchemy/testing/profiling.py +329 -0
- sqlalchemy/testing/provision.py +603 -0
- sqlalchemy/testing/requirements.py +1945 -0
- sqlalchemy/testing/schema.py +198 -0
- sqlalchemy/testing/suite/__init__.py +19 -0
- sqlalchemy/testing/suite/test_cte.py +237 -0
- sqlalchemy/testing/suite/test_ddl.py +389 -0
- sqlalchemy/testing/suite/test_deprecations.py +153 -0
- sqlalchemy/testing/suite/test_dialect.py +776 -0
- sqlalchemy/testing/suite/test_insert.py +630 -0
- sqlalchemy/testing/suite/test_reflection.py +3557 -0
- sqlalchemy/testing/suite/test_results.py +504 -0
- sqlalchemy/testing/suite/test_rowcount.py +258 -0
- sqlalchemy/testing/suite/test_select.py +2010 -0
- sqlalchemy/testing/suite/test_sequence.py +317 -0
- sqlalchemy/testing/suite/test_types.py +2147 -0
- sqlalchemy/testing/suite/test_unicode_ddl.py +189 -0
- sqlalchemy/testing/suite/test_update_delete.py +139 -0
- sqlalchemy/testing/util.py +535 -0
- sqlalchemy/testing/warnings.py +52 -0
- sqlalchemy/types.py +74 -0
- sqlalchemy/util/__init__.py +162 -0
- sqlalchemy/util/_collections.py +712 -0
- sqlalchemy/util/_concurrency_py3k.py +288 -0
- sqlalchemy/util/_has_cy.py +40 -0
- sqlalchemy/util/_py_collections.py +541 -0
- sqlalchemy/util/compat.py +421 -0
- sqlalchemy/util/concurrency.py +110 -0
- sqlalchemy/util/deprecations.py +401 -0
- sqlalchemy/util/langhelpers.py +2203 -0
- sqlalchemy/util/preloaded.py +150 -0
- sqlalchemy/util/queue.py +322 -0
- sqlalchemy/util/tool_support.py +201 -0
- sqlalchemy/util/topological.py +120 -0
- sqlalchemy/util/typing.py +734 -0
- sqlalchemy-2.0.47.dist-info/METADATA +243 -0
- sqlalchemy-2.0.47.dist-info/RECORD +274 -0
- sqlalchemy-2.0.47.dist-info/WHEEL +5 -0
- sqlalchemy-2.0.47.dist-info/licenses/LICENSE +19 -0
- sqlalchemy-2.0.47.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# engine/mock.py
|
|
2
|
+
# Copyright (C) 2005-2026 the SQLAlchemy authors and contributors
|
|
3
|
+
# <see AUTHORS file>
|
|
4
|
+
#
|
|
5
|
+
# This module is part of SQLAlchemy and is released under
|
|
6
|
+
# the MIT License: https://www.opensource.org/licenses/mit-license.php
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from operator import attrgetter
|
|
11
|
+
import typing
|
|
12
|
+
from typing import Any
|
|
13
|
+
from typing import Callable
|
|
14
|
+
from typing import cast
|
|
15
|
+
from typing import Optional
|
|
16
|
+
from typing import Type
|
|
17
|
+
from typing import Union
|
|
18
|
+
|
|
19
|
+
from . import url as _url
|
|
20
|
+
from .. import util
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
if typing.TYPE_CHECKING:
|
|
24
|
+
from .base import Engine
|
|
25
|
+
from .interfaces import _CoreAnyExecuteParams
|
|
26
|
+
from .interfaces import CoreExecuteOptionsParameter
|
|
27
|
+
from .interfaces import Dialect
|
|
28
|
+
from .url import URL
|
|
29
|
+
from ..sql.base import Executable
|
|
30
|
+
from ..sql.ddl import InvokeDDLBase
|
|
31
|
+
from ..sql.schema import HasSchemaAttr
|
|
32
|
+
from ..sql.visitors import Visitable
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class MockConnection:
|
|
36
|
+
def __init__(self, dialect: Dialect, execute: Callable[..., Any]):
|
|
37
|
+
self._dialect = dialect
|
|
38
|
+
self._execute_impl = execute
|
|
39
|
+
|
|
40
|
+
engine: Engine = cast(Any, property(lambda s: s))
|
|
41
|
+
dialect: Dialect = cast(Any, property(attrgetter("_dialect")))
|
|
42
|
+
name: str = cast(Any, property(lambda s: s._dialect.name))
|
|
43
|
+
|
|
44
|
+
def connect(self, **kwargs: Any) -> MockConnection:
|
|
45
|
+
return self
|
|
46
|
+
|
|
47
|
+
def schema_for_object(self, obj: HasSchemaAttr) -> Optional[str]:
|
|
48
|
+
return obj.schema
|
|
49
|
+
|
|
50
|
+
def execution_options(self, **kw: Any) -> MockConnection:
|
|
51
|
+
return self
|
|
52
|
+
|
|
53
|
+
def _run_ddl_visitor(
|
|
54
|
+
self,
|
|
55
|
+
visitorcallable: Type[InvokeDDLBase],
|
|
56
|
+
element: Visitable,
|
|
57
|
+
**kwargs: Any,
|
|
58
|
+
) -> None:
|
|
59
|
+
kwargs["checkfirst"] = False
|
|
60
|
+
visitorcallable(
|
|
61
|
+
dialect=self.dialect, connection=self, **kwargs
|
|
62
|
+
).traverse_single(element)
|
|
63
|
+
|
|
64
|
+
def execute(
|
|
65
|
+
self,
|
|
66
|
+
obj: Executable,
|
|
67
|
+
parameters: Optional[_CoreAnyExecuteParams] = None,
|
|
68
|
+
execution_options: Optional[CoreExecuteOptionsParameter] = None,
|
|
69
|
+
) -> Any:
|
|
70
|
+
return self._execute_impl(obj, parameters)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def create_mock_engine(
|
|
74
|
+
url: Union[str, URL], executor: Any, **kw: Any
|
|
75
|
+
) -> MockConnection:
|
|
76
|
+
"""Create a "mock" engine used for echoing DDL.
|
|
77
|
+
|
|
78
|
+
This is a utility function used for debugging or storing the output of DDL
|
|
79
|
+
sequences as generated by :meth:`_schema.MetaData.create_all`
|
|
80
|
+
and related methods.
|
|
81
|
+
|
|
82
|
+
The function accepts a URL which is used only to determine the kind of
|
|
83
|
+
dialect to be used, as well as an "executor" callable function which
|
|
84
|
+
will receive a SQL expression object and parameters, which can then be
|
|
85
|
+
echoed or otherwise printed. The executor's return value is not handled,
|
|
86
|
+
nor does the engine allow regular string statements to be invoked, and
|
|
87
|
+
is therefore only useful for DDL that is sent to the database without
|
|
88
|
+
receiving any results.
|
|
89
|
+
|
|
90
|
+
E.g.::
|
|
91
|
+
|
|
92
|
+
from sqlalchemy import create_mock_engine
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def dump(sql, *multiparams, **params):
|
|
96
|
+
print(sql.compile(dialect=engine.dialect))
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
engine = create_mock_engine("postgresql+psycopg2://", dump)
|
|
100
|
+
metadata.create_all(engine, checkfirst=False)
|
|
101
|
+
|
|
102
|
+
:param url: A string URL which typically needs to contain only the
|
|
103
|
+
database backend name.
|
|
104
|
+
|
|
105
|
+
:param executor: a callable which receives the arguments ``sql``,
|
|
106
|
+
``*multiparams`` and ``**params``. The ``sql`` parameter is typically
|
|
107
|
+
an instance of :class:`.ExecutableDDLElement`, which can then be compiled
|
|
108
|
+
into a string using :meth:`.ExecutableDDLElement.compile`.
|
|
109
|
+
|
|
110
|
+
.. versionadded:: 1.4 - the :func:`.create_mock_engine` function replaces
|
|
111
|
+
the previous "mock" engine strategy used with
|
|
112
|
+
:func:`_sa.create_engine`.
|
|
113
|
+
|
|
114
|
+
.. seealso::
|
|
115
|
+
|
|
116
|
+
:ref:`faq_ddl_as_string`
|
|
117
|
+
|
|
118
|
+
"""
|
|
119
|
+
|
|
120
|
+
# create url.URL object
|
|
121
|
+
u = _url.make_url(url)
|
|
122
|
+
|
|
123
|
+
dialect_cls = u.get_dialect()
|
|
124
|
+
|
|
125
|
+
dialect_args = {}
|
|
126
|
+
# consume dialect arguments from kwargs
|
|
127
|
+
for k in util.get_cls_kwargs(dialect_cls):
|
|
128
|
+
if k in kw:
|
|
129
|
+
dialect_args[k] = kw.pop(k)
|
|
130
|
+
|
|
131
|
+
# create dialect
|
|
132
|
+
dialect = dialect_cls(**dialect_args)
|
|
133
|
+
|
|
134
|
+
return MockConnection(dialect, executor)
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# engine/processors.py
|
|
2
|
+
# Copyright (C) 2010-2026 the SQLAlchemy authors and contributors
|
|
3
|
+
# <see AUTHORS file>
|
|
4
|
+
# Copyright (C) 2010 Gaetan de Menten gdementen@gmail.com
|
|
5
|
+
#
|
|
6
|
+
# This module is part of SQLAlchemy and is released under
|
|
7
|
+
# the MIT License: https://www.opensource.org/licenses/mit-license.php
|
|
8
|
+
|
|
9
|
+
"""defines generic type conversion functions, as used in bind and result
|
|
10
|
+
processors.
|
|
11
|
+
|
|
12
|
+
They all share one common characteristic: None is passed through unchanged.
|
|
13
|
+
|
|
14
|
+
"""
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import typing
|
|
18
|
+
|
|
19
|
+
from ._py_processors import str_to_datetime_processor_factory # noqa
|
|
20
|
+
from ..util._has_cy import HAS_CYEXTENSION
|
|
21
|
+
|
|
22
|
+
if typing.TYPE_CHECKING or not HAS_CYEXTENSION:
|
|
23
|
+
from ._py_processors import int_to_boolean as int_to_boolean
|
|
24
|
+
from ._py_processors import str_to_date as str_to_date
|
|
25
|
+
from ._py_processors import str_to_datetime as str_to_datetime
|
|
26
|
+
from ._py_processors import str_to_time as str_to_time
|
|
27
|
+
from ._py_processors import (
|
|
28
|
+
to_decimal_processor_factory as to_decimal_processor_factory,
|
|
29
|
+
)
|
|
30
|
+
from ._py_processors import to_float as to_float
|
|
31
|
+
from ._py_processors import to_str as to_str
|
|
32
|
+
else:
|
|
33
|
+
from sqlalchemy.cyextension.processors import (
|
|
34
|
+
DecimalResultProcessor,
|
|
35
|
+
)
|
|
36
|
+
from sqlalchemy.cyextension.processors import ( # noqa: F401
|
|
37
|
+
int_to_boolean as int_to_boolean,
|
|
38
|
+
)
|
|
39
|
+
from sqlalchemy.cyextension.processors import ( # noqa: F401,E501
|
|
40
|
+
str_to_date as str_to_date,
|
|
41
|
+
)
|
|
42
|
+
from sqlalchemy.cyextension.processors import ( # noqa: F401
|
|
43
|
+
str_to_datetime as str_to_datetime,
|
|
44
|
+
)
|
|
45
|
+
from sqlalchemy.cyextension.processors import ( # noqa: F401,E501
|
|
46
|
+
str_to_time as str_to_time,
|
|
47
|
+
)
|
|
48
|
+
from sqlalchemy.cyextension.processors import ( # noqa: F401,E501
|
|
49
|
+
to_float as to_float,
|
|
50
|
+
)
|
|
51
|
+
from sqlalchemy.cyextension.processors import ( # noqa: F401,E501
|
|
52
|
+
to_str as to_str,
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
def to_decimal_processor_factory(target_class, scale):
|
|
56
|
+
# Note that the scale argument is not taken into account for integer
|
|
57
|
+
# values in the C implementation while it is in the Python one.
|
|
58
|
+
# For example, the Python implementation might return
|
|
59
|
+
# Decimal('5.00000') whereas the C implementation will
|
|
60
|
+
# return Decimal('5'). These are equivalent of course.
|
|
61
|
+
return DecimalResultProcessor(target_class, "%%.%df" % scale).process
|