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,102 @@
|
|
|
1
|
+
# cyextension/resultproxy.pyx
|
|
2
|
+
# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors
|
|
3
|
+
# <see AUTHORS file>
|
|
4
|
+
#
|
|
5
|
+
# This module is part of SQLAlchemy and is released under
|
|
6
|
+
# the MIT License: https://www.opensource.org/licenses/mit-license.php
|
|
7
|
+
import operator
|
|
8
|
+
|
|
9
|
+
cdef class BaseRow:
|
|
10
|
+
cdef readonly object _parent
|
|
11
|
+
cdef readonly dict _key_to_index
|
|
12
|
+
cdef readonly tuple _data
|
|
13
|
+
|
|
14
|
+
def __init__(self, object parent, object processors, dict key_to_index, object data):
|
|
15
|
+
"""Row objects are constructed by CursorResult objects."""
|
|
16
|
+
|
|
17
|
+
self._parent = parent
|
|
18
|
+
|
|
19
|
+
self._key_to_index = key_to_index
|
|
20
|
+
|
|
21
|
+
if processors:
|
|
22
|
+
self._data = _apply_processors(processors, data)
|
|
23
|
+
else:
|
|
24
|
+
self._data = tuple(data)
|
|
25
|
+
|
|
26
|
+
def __reduce__(self):
|
|
27
|
+
return (
|
|
28
|
+
rowproxy_reconstructor,
|
|
29
|
+
(self.__class__, self.__getstate__()),
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
def __getstate__(self):
|
|
33
|
+
return {"_parent": self._parent, "_data": self._data}
|
|
34
|
+
|
|
35
|
+
def __setstate__(self, dict state):
|
|
36
|
+
parent = state["_parent"]
|
|
37
|
+
self._parent = parent
|
|
38
|
+
self._data = state["_data"]
|
|
39
|
+
self._key_to_index = parent._key_to_index
|
|
40
|
+
|
|
41
|
+
def _values_impl(self):
|
|
42
|
+
return list(self)
|
|
43
|
+
|
|
44
|
+
def __iter__(self):
|
|
45
|
+
return iter(self._data)
|
|
46
|
+
|
|
47
|
+
def __len__(self):
|
|
48
|
+
return len(self._data)
|
|
49
|
+
|
|
50
|
+
def __hash__(self):
|
|
51
|
+
return hash(self._data)
|
|
52
|
+
|
|
53
|
+
def __getitem__(self, index):
|
|
54
|
+
return self._data[index]
|
|
55
|
+
|
|
56
|
+
def _get_by_key_impl_mapping(self, key):
|
|
57
|
+
return self._get_by_key_impl(key, 0)
|
|
58
|
+
|
|
59
|
+
cdef _get_by_key_impl(self, object key, int attr_err):
|
|
60
|
+
index = self._key_to_index.get(key)
|
|
61
|
+
if index is not None:
|
|
62
|
+
return self._data[<int>index]
|
|
63
|
+
self._parent._key_not_found(key, attr_err != 0)
|
|
64
|
+
|
|
65
|
+
def __getattr__(self, name):
|
|
66
|
+
return self._get_by_key_impl(name, 1)
|
|
67
|
+
|
|
68
|
+
def _to_tuple_instance(self):
|
|
69
|
+
return self._data
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
cdef tuple _apply_processors(proc, data):
|
|
73
|
+
res = []
|
|
74
|
+
for i in range(len(proc)):
|
|
75
|
+
p = proc[i]
|
|
76
|
+
if p is None:
|
|
77
|
+
res.append(data[i])
|
|
78
|
+
else:
|
|
79
|
+
res.append(p(data[i]))
|
|
80
|
+
return tuple(res)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def rowproxy_reconstructor(cls, state):
|
|
84
|
+
obj = cls.__new__(cls)
|
|
85
|
+
obj.__setstate__(state)
|
|
86
|
+
return obj
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
cdef int is_contiguous(tuple indexes):
|
|
90
|
+
cdef int i
|
|
91
|
+
for i in range(1, len(indexes)):
|
|
92
|
+
if indexes[i-1] != indexes[i] -1:
|
|
93
|
+
return 0
|
|
94
|
+
return 1
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def tuplegetter(*indexes):
|
|
98
|
+
if len(indexes) == 1 or is_contiguous(indexes) != 0:
|
|
99
|
+
# slice form is faster but returns a list if input is list
|
|
100
|
+
return operator.itemgetter(slice(indexes[0], indexes[-1] + 1))
|
|
101
|
+
else:
|
|
102
|
+
return operator.itemgetter(*indexes)
|
|
Binary file
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# cyextension/util.pyx
|
|
2
|
+
# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors
|
|
3
|
+
# <see AUTHORS file>
|
|
4
|
+
#
|
|
5
|
+
# This module is part of SQLAlchemy and is released under
|
|
6
|
+
# the MIT License: https://www.opensource.org/licenses/mit-license.php
|
|
7
|
+
from collections.abc import Mapping
|
|
8
|
+
|
|
9
|
+
from sqlalchemy import exc
|
|
10
|
+
|
|
11
|
+
cdef tuple _Empty_Tuple = ()
|
|
12
|
+
|
|
13
|
+
cdef inline bint _is_mapping_or_tuple(object value):
|
|
14
|
+
return isinstance(value, dict) or isinstance(value, tuple) or isinstance(value, Mapping)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
cdef inline bint _is_mapping(object value):
|
|
18
|
+
return isinstance(value, dict) or isinstance(value, Mapping)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def _distill_params_20(object params):
|
|
22
|
+
if params is None:
|
|
23
|
+
return _Empty_Tuple
|
|
24
|
+
elif isinstance(params, list) or isinstance(params, tuple):
|
|
25
|
+
if params and not _is_mapping(params[0]):
|
|
26
|
+
raise exc.ArgumentError(
|
|
27
|
+
"List argument must consist only of dictionaries"
|
|
28
|
+
)
|
|
29
|
+
return params
|
|
30
|
+
elif _is_mapping(params):
|
|
31
|
+
return [params]
|
|
32
|
+
else:
|
|
33
|
+
raise exc.ArgumentError("mapping or list expected for parameters")
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _distill_raw_params(object params):
|
|
37
|
+
if params is None:
|
|
38
|
+
return _Empty_Tuple
|
|
39
|
+
elif isinstance(params, list):
|
|
40
|
+
if params and not _is_mapping_or_tuple(params[0]):
|
|
41
|
+
raise exc.ArgumentError(
|
|
42
|
+
"List argument must consist only of tuples or dictionaries"
|
|
43
|
+
)
|
|
44
|
+
return params
|
|
45
|
+
elif _is_mapping_or_tuple(params):
|
|
46
|
+
return [params]
|
|
47
|
+
else:
|
|
48
|
+
raise exc.ArgumentError("mapping or sequence expected for parameters")
|
|
49
|
+
|
|
50
|
+
cdef class prefix_anon_map(dict):
|
|
51
|
+
def __missing__(self, str key):
|
|
52
|
+
cdef str derived
|
|
53
|
+
cdef int anonymous_counter
|
|
54
|
+
cdef dict self_dict = self
|
|
55
|
+
|
|
56
|
+
derived = key.split(" ", 1)[1]
|
|
57
|
+
|
|
58
|
+
anonymous_counter = self_dict.get(derived, 1)
|
|
59
|
+
self_dict[derived] = anonymous_counter + 1
|
|
60
|
+
value = f"{derived}_{anonymous_counter}"
|
|
61
|
+
self_dict[key] = value
|
|
62
|
+
return value
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
cdef class cache_anon_map(dict):
|
|
66
|
+
cdef int _index
|
|
67
|
+
|
|
68
|
+
def __init__(self):
|
|
69
|
+
self._index = 0
|
|
70
|
+
|
|
71
|
+
def get_anon(self, obj):
|
|
72
|
+
cdef long long idself
|
|
73
|
+
cdef str id_
|
|
74
|
+
cdef dict self_dict = self
|
|
75
|
+
|
|
76
|
+
idself = id(obj)
|
|
77
|
+
if idself in self_dict:
|
|
78
|
+
return self_dict[idself], True
|
|
79
|
+
else:
|
|
80
|
+
id_ = self.__missing__(idself)
|
|
81
|
+
return id_, False
|
|
82
|
+
|
|
83
|
+
def __missing__(self, key):
|
|
84
|
+
cdef str val
|
|
85
|
+
cdef dict self_dict = self
|
|
86
|
+
|
|
87
|
+
self_dict[key] = val = str(self._index)
|
|
88
|
+
self._index += 1
|
|
89
|
+
return val
|
|
90
|
+
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# dialects/__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
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from typing import Any
|
|
11
|
+
from typing import Callable
|
|
12
|
+
from typing import Optional
|
|
13
|
+
from typing import Type
|
|
14
|
+
from typing import TYPE_CHECKING
|
|
15
|
+
|
|
16
|
+
from .. import util
|
|
17
|
+
|
|
18
|
+
if TYPE_CHECKING:
|
|
19
|
+
from ..engine.interfaces import Dialect
|
|
20
|
+
|
|
21
|
+
__all__ = ("mssql", "mysql", "oracle", "postgresql", "sqlite")
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _auto_fn(name: str) -> Optional[Callable[[], Type[Dialect]]]:
|
|
25
|
+
"""default dialect importer.
|
|
26
|
+
|
|
27
|
+
plugs into the :class:`.PluginLoader`
|
|
28
|
+
as a first-hit system.
|
|
29
|
+
|
|
30
|
+
"""
|
|
31
|
+
if "." in name:
|
|
32
|
+
dialect, driver = name.split(".")
|
|
33
|
+
else:
|
|
34
|
+
dialect = name
|
|
35
|
+
driver = "base"
|
|
36
|
+
|
|
37
|
+
try:
|
|
38
|
+
if dialect == "mariadb":
|
|
39
|
+
# it's "OK" for us to hardcode here since _auto_fn is already
|
|
40
|
+
# hardcoded. if mysql / mariadb etc were third party dialects
|
|
41
|
+
# they would just publish all the entrypoints, which would actually
|
|
42
|
+
# look much nicer.
|
|
43
|
+
module: Any = __import__(
|
|
44
|
+
"sqlalchemy.dialects.mysql.mariadb"
|
|
45
|
+
).dialects.mysql.mariadb
|
|
46
|
+
return module.loader(driver) # type: ignore
|
|
47
|
+
else:
|
|
48
|
+
module = __import__("sqlalchemy.dialects.%s" % (dialect,)).dialects
|
|
49
|
+
module = getattr(module, dialect)
|
|
50
|
+
except ImportError:
|
|
51
|
+
return None
|
|
52
|
+
|
|
53
|
+
if hasattr(module, driver):
|
|
54
|
+
module = getattr(module, driver)
|
|
55
|
+
return lambda: module.dialect
|
|
56
|
+
else:
|
|
57
|
+
return None
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
registry = util.PluginLoader("sqlalchemy.dialects", auto_fn=_auto_fn)
|
|
61
|
+
|
|
62
|
+
plugins = util.PluginLoader("sqlalchemy.plugins")
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# dialects/_typing.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
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from typing import Any
|
|
10
|
+
from typing import Iterable
|
|
11
|
+
from typing import Mapping
|
|
12
|
+
from typing import Optional
|
|
13
|
+
from typing import Union
|
|
14
|
+
|
|
15
|
+
from ..sql import roles
|
|
16
|
+
from ..sql.base import ColumnCollection
|
|
17
|
+
from ..sql.schema import Column
|
|
18
|
+
from ..sql.schema import ColumnCollectionConstraint
|
|
19
|
+
from ..sql.schema import Index
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
_OnConflictConstraintT = Union[str, ColumnCollectionConstraint, Index, None]
|
|
23
|
+
_OnConflictIndexElementsT = Optional[
|
|
24
|
+
Iterable[Union[Column[Any], str, roles.DDLConstraintColumnRole]]
|
|
25
|
+
]
|
|
26
|
+
_OnConflictIndexWhereT = Optional[roles.WhereHavingRole]
|
|
27
|
+
_OnConflictSetT = Optional[
|
|
28
|
+
Union[Mapping[Any, Any], ColumnCollection[Any, Any]]
|
|
29
|
+
]
|
|
30
|
+
_OnConflictWhereT = Optional[roles.WhereHavingRole]
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# dialects/mssql/__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
|
+
# mypy: ignore-errors
|
|
8
|
+
|
|
9
|
+
from . import aioodbc # noqa
|
|
10
|
+
from . import base # noqa
|
|
11
|
+
from . import pymssql # noqa
|
|
12
|
+
from . import pyodbc # noqa
|
|
13
|
+
from .base import BIGINT
|
|
14
|
+
from .base import BINARY
|
|
15
|
+
from .base import BIT
|
|
16
|
+
from .base import CHAR
|
|
17
|
+
from .base import DATE
|
|
18
|
+
from .base import DATETIME
|
|
19
|
+
from .base import DATETIME2
|
|
20
|
+
from .base import DATETIMEOFFSET
|
|
21
|
+
from .base import DECIMAL
|
|
22
|
+
from .base import DOUBLE_PRECISION
|
|
23
|
+
from .base import FLOAT
|
|
24
|
+
from .base import IMAGE
|
|
25
|
+
from .base import INTEGER
|
|
26
|
+
from .base import JSON
|
|
27
|
+
from .base import MONEY
|
|
28
|
+
from .base import NCHAR
|
|
29
|
+
from .base import NTEXT
|
|
30
|
+
from .base import NUMERIC
|
|
31
|
+
from .base import NVARCHAR
|
|
32
|
+
from .base import REAL
|
|
33
|
+
from .base import ROWVERSION
|
|
34
|
+
from .base import SMALLDATETIME
|
|
35
|
+
from .base import SMALLINT
|
|
36
|
+
from .base import SMALLMONEY
|
|
37
|
+
from .base import SQL_VARIANT
|
|
38
|
+
from .base import TEXT
|
|
39
|
+
from .base import TIME
|
|
40
|
+
from .base import TIMESTAMP
|
|
41
|
+
from .base import TINYINT
|
|
42
|
+
from .base import UNIQUEIDENTIFIER
|
|
43
|
+
from .base import VARBINARY
|
|
44
|
+
from .base import VARCHAR
|
|
45
|
+
from .base import XML
|
|
46
|
+
from ...sql import try_cast
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
base.dialect = dialect = pyodbc.dialect
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
__all__ = (
|
|
53
|
+
"JSON",
|
|
54
|
+
"INTEGER",
|
|
55
|
+
"BIGINT",
|
|
56
|
+
"SMALLINT",
|
|
57
|
+
"TINYINT",
|
|
58
|
+
"VARCHAR",
|
|
59
|
+
"NVARCHAR",
|
|
60
|
+
"CHAR",
|
|
61
|
+
"NCHAR",
|
|
62
|
+
"TEXT",
|
|
63
|
+
"NTEXT",
|
|
64
|
+
"DECIMAL",
|
|
65
|
+
"NUMERIC",
|
|
66
|
+
"FLOAT",
|
|
67
|
+
"DATETIME",
|
|
68
|
+
"DATETIME2",
|
|
69
|
+
"DATETIMEOFFSET",
|
|
70
|
+
"DATE",
|
|
71
|
+
"DOUBLE_PRECISION",
|
|
72
|
+
"TIME",
|
|
73
|
+
"SMALLDATETIME",
|
|
74
|
+
"BINARY",
|
|
75
|
+
"VARBINARY",
|
|
76
|
+
"BIT",
|
|
77
|
+
"REAL",
|
|
78
|
+
"IMAGE",
|
|
79
|
+
"TIMESTAMP",
|
|
80
|
+
"ROWVERSION",
|
|
81
|
+
"MONEY",
|
|
82
|
+
"SMALLMONEY",
|
|
83
|
+
"UNIQUEIDENTIFIER",
|
|
84
|
+
"SQL_VARIANT",
|
|
85
|
+
"XML",
|
|
86
|
+
"dialect",
|
|
87
|
+
"try_cast",
|
|
88
|
+
)
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# dialects/mssql/aioodbc.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
|
+
r"""
|
|
9
|
+
.. dialect:: mssql+aioodbc
|
|
10
|
+
:name: aioodbc
|
|
11
|
+
:dbapi: aioodbc
|
|
12
|
+
:connectstring: mssql+aioodbc://<username>:<password>@<dsnname>
|
|
13
|
+
:url: https://pypi.org/project/aioodbc/
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
Support for the SQL Server database in asyncio style, using the aioodbc
|
|
17
|
+
driver which itself is a thread-wrapper around pyodbc.
|
|
18
|
+
|
|
19
|
+
.. versionadded:: 2.0.23 Added the mssql+aioodbc dialect which builds
|
|
20
|
+
on top of the pyodbc and general aio* dialect architecture.
|
|
21
|
+
|
|
22
|
+
Using a special asyncio mediation layer, the aioodbc dialect is usable
|
|
23
|
+
as the backend for the :ref:`SQLAlchemy asyncio <asyncio_toplevel>`
|
|
24
|
+
extension package.
|
|
25
|
+
|
|
26
|
+
Most behaviors and caveats for this driver are the same as that of the
|
|
27
|
+
pyodbc dialect used on SQL Server; see :ref:`mssql_pyodbc` for general
|
|
28
|
+
background.
|
|
29
|
+
|
|
30
|
+
This dialect should normally be used only with the
|
|
31
|
+
:func:`_asyncio.create_async_engine` engine creation function; connection
|
|
32
|
+
styles are otherwise equivalent to those documented in the pyodbc section::
|
|
33
|
+
|
|
34
|
+
from sqlalchemy.ext.asyncio import create_async_engine
|
|
35
|
+
|
|
36
|
+
engine = create_async_engine(
|
|
37
|
+
"mssql+aioodbc://scott:tiger@mssql2017:1433/test?"
|
|
38
|
+
"driver=ODBC+Driver+18+for+SQL+Server&TrustServerCertificate=yes"
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
from __future__ import annotations
|
|
44
|
+
|
|
45
|
+
from .pyodbc import MSDialect_pyodbc
|
|
46
|
+
from .pyodbc import MSExecutionContext_pyodbc
|
|
47
|
+
from ...connectors.aioodbc import aiodbcConnector
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class MSExecutionContext_aioodbc(MSExecutionContext_pyodbc):
|
|
51
|
+
def create_server_side_cursor(self):
|
|
52
|
+
return self._dbapi_connection.cursor(server_side=True)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class MSDialectAsync_aioodbc(aiodbcConnector, MSDialect_pyodbc):
|
|
56
|
+
driver = "aioodbc"
|
|
57
|
+
|
|
58
|
+
supports_statement_cache = True
|
|
59
|
+
|
|
60
|
+
execution_ctx_cls = MSExecutionContext_aioodbc
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
dialect = MSDialectAsync_aioodbc
|