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,365 @@
|
|
|
1
|
+
# dialects/oracle/vector.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 __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import array
|
|
13
|
+
from dataclasses import dataclass
|
|
14
|
+
from enum import Enum
|
|
15
|
+
from typing import Optional
|
|
16
|
+
from typing import Union
|
|
17
|
+
|
|
18
|
+
from ... import types
|
|
19
|
+
from ...types import Float
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class VectorIndexType(Enum):
|
|
23
|
+
"""Enum representing different types of VECTOR index structures.
|
|
24
|
+
|
|
25
|
+
See :ref:`oracle_vector_datatype` for background.
|
|
26
|
+
|
|
27
|
+
.. versionadded:: 2.0.41
|
|
28
|
+
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
HNSW = "HNSW"
|
|
32
|
+
"""
|
|
33
|
+
The HNSW (Hierarchical Navigable Small World) index type.
|
|
34
|
+
"""
|
|
35
|
+
IVF = "IVF"
|
|
36
|
+
"""
|
|
37
|
+
The IVF (Inverted File Index) index type
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class VectorDistanceType(Enum):
|
|
42
|
+
"""Enum representing different types of vector distance metrics.
|
|
43
|
+
|
|
44
|
+
See :ref:`oracle_vector_datatype` for background.
|
|
45
|
+
|
|
46
|
+
.. versionadded:: 2.0.41
|
|
47
|
+
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
EUCLIDEAN = "EUCLIDEAN"
|
|
51
|
+
"""Euclidean distance (L2 norm).
|
|
52
|
+
|
|
53
|
+
Measures the straight-line distance between two vectors in space.
|
|
54
|
+
"""
|
|
55
|
+
DOT = "DOT"
|
|
56
|
+
"""Dot product similarity.
|
|
57
|
+
|
|
58
|
+
Measures the algebraic similarity between two vectors.
|
|
59
|
+
"""
|
|
60
|
+
COSINE = "COSINE"
|
|
61
|
+
"""Cosine similarity.
|
|
62
|
+
|
|
63
|
+
Measures the cosine of the angle between two vectors.
|
|
64
|
+
"""
|
|
65
|
+
MANHATTAN = "MANHATTAN"
|
|
66
|
+
"""Manhattan distance (L1 norm).
|
|
67
|
+
|
|
68
|
+
Calculates the sum of absolute differences across dimensions.
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class VectorStorageFormat(Enum):
|
|
73
|
+
"""Enum representing the data format used to store vector components.
|
|
74
|
+
|
|
75
|
+
See :ref:`oracle_vector_datatype` for background.
|
|
76
|
+
|
|
77
|
+
.. versionadded:: 2.0.41
|
|
78
|
+
|
|
79
|
+
"""
|
|
80
|
+
|
|
81
|
+
INT8 = "INT8"
|
|
82
|
+
"""
|
|
83
|
+
8-bit integer format.
|
|
84
|
+
"""
|
|
85
|
+
BINARY = "BINARY"
|
|
86
|
+
"""
|
|
87
|
+
Binary format.
|
|
88
|
+
"""
|
|
89
|
+
FLOAT32 = "FLOAT32"
|
|
90
|
+
"""
|
|
91
|
+
32-bit floating-point format.
|
|
92
|
+
"""
|
|
93
|
+
FLOAT64 = "FLOAT64"
|
|
94
|
+
"""
|
|
95
|
+
64-bit floating-point format.
|
|
96
|
+
"""
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
class VectorStorageType(Enum):
|
|
100
|
+
"""Enum representing the vector type,
|
|
101
|
+
|
|
102
|
+
See :ref:`oracle_vector_datatype` for background.
|
|
103
|
+
|
|
104
|
+
.. versionadded:: 2.0.43
|
|
105
|
+
|
|
106
|
+
"""
|
|
107
|
+
|
|
108
|
+
SPARSE = "SPARSE"
|
|
109
|
+
"""
|
|
110
|
+
A Sparse vector is a vector which has zero value for
|
|
111
|
+
most of its dimensions.
|
|
112
|
+
"""
|
|
113
|
+
DENSE = "DENSE"
|
|
114
|
+
"""
|
|
115
|
+
A Dense vector is a vector where most, if not all, elements
|
|
116
|
+
hold meaningful values.
|
|
117
|
+
"""
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
@dataclass
|
|
121
|
+
class VectorIndexConfig:
|
|
122
|
+
"""Define the configuration for Oracle VECTOR Index.
|
|
123
|
+
|
|
124
|
+
See :ref:`oracle_vector_datatype` for background.
|
|
125
|
+
|
|
126
|
+
.. versionadded:: 2.0.41
|
|
127
|
+
|
|
128
|
+
:param index_type: Enum value from :class:`.VectorIndexType`
|
|
129
|
+
Specifies the indexing method. For HNSW, this must be
|
|
130
|
+
:attr:`.VectorIndexType.HNSW`.
|
|
131
|
+
|
|
132
|
+
:param distance: Enum value from :class:`.VectorDistanceType`
|
|
133
|
+
specifies the metric for calculating distance between VECTORS.
|
|
134
|
+
|
|
135
|
+
:param accuracy: integer. Should be in the range 0 to 100
|
|
136
|
+
Specifies the accuracy of the nearest neighbor search during
|
|
137
|
+
query execution.
|
|
138
|
+
|
|
139
|
+
:param parallel: integer. Specifies degree of parallelism.
|
|
140
|
+
|
|
141
|
+
:param hnsw_neighbors: integer. Should be in the range 0 to
|
|
142
|
+
2048. Specifies the number of nearest neighbors considered
|
|
143
|
+
during the search. The attribute :attr:`.VectorIndexConfig.hnsw_neighbors`
|
|
144
|
+
is HNSW index specific.
|
|
145
|
+
|
|
146
|
+
:param hnsw_efconstruction: integer. Should be in the range 0
|
|
147
|
+
to 65535. Controls the trade-off between indexing speed and
|
|
148
|
+
recall quality during index construction. The attribute
|
|
149
|
+
:attr:`.VectorIndexConfig.hnsw_efconstruction` is HNSW index
|
|
150
|
+
specific.
|
|
151
|
+
|
|
152
|
+
:param ivf_neighbor_partitions: integer. Should be in the range
|
|
153
|
+
0 to 10,000,000. Specifies the number of partitions used to
|
|
154
|
+
divide the dataset. The attribute
|
|
155
|
+
:attr:`.VectorIndexConfig.ivf_neighbor_partitions` is IVF index
|
|
156
|
+
specific.
|
|
157
|
+
|
|
158
|
+
:param ivf_sample_per_partition: integer. Should be between 1
|
|
159
|
+
and ``num_vectors / neighbor partitions``. Specifies the
|
|
160
|
+
number of samples used per partition. The attribute
|
|
161
|
+
:attr:`.VectorIndexConfig.ivf_sample_per_partition` is IVF index
|
|
162
|
+
specific.
|
|
163
|
+
|
|
164
|
+
:param ivf_min_vectors_per_partition: integer. From 0 (no trimming)
|
|
165
|
+
to the total number of vectors (results in 1 partition). Specifies
|
|
166
|
+
the minimum number of vectors per partition. The attribute
|
|
167
|
+
:attr:`.VectorIndexConfig.ivf_min_vectors_per_partition`
|
|
168
|
+
is IVF index specific.
|
|
169
|
+
|
|
170
|
+
"""
|
|
171
|
+
|
|
172
|
+
index_type: VectorIndexType = VectorIndexType.HNSW
|
|
173
|
+
distance: Optional[VectorDistanceType] = None
|
|
174
|
+
accuracy: Optional[int] = None
|
|
175
|
+
hnsw_neighbors: Optional[int] = None
|
|
176
|
+
hnsw_efconstruction: Optional[int] = None
|
|
177
|
+
ivf_neighbor_partitions: Optional[int] = None
|
|
178
|
+
ivf_sample_per_partition: Optional[int] = None
|
|
179
|
+
ivf_min_vectors_per_partition: Optional[int] = None
|
|
180
|
+
parallel: Optional[int] = None
|
|
181
|
+
|
|
182
|
+
def __post_init__(self):
|
|
183
|
+
self.index_type = VectorIndexType(self.index_type)
|
|
184
|
+
for field in [
|
|
185
|
+
"hnsw_neighbors",
|
|
186
|
+
"hnsw_efconstruction",
|
|
187
|
+
"ivf_neighbor_partitions",
|
|
188
|
+
"ivf_sample_per_partition",
|
|
189
|
+
"ivf_min_vectors_per_partition",
|
|
190
|
+
"parallel",
|
|
191
|
+
"accuracy",
|
|
192
|
+
]:
|
|
193
|
+
value = getattr(self, field)
|
|
194
|
+
if value is not None and not isinstance(value, int):
|
|
195
|
+
raise TypeError(
|
|
196
|
+
f"{field} must be an integer if"
|
|
197
|
+
f"provided, got {type(value).__name__}"
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
class SparseVector:
|
|
202
|
+
"""
|
|
203
|
+
Lightweight SQLAlchemy-side version of SparseVector.
|
|
204
|
+
This mimics oracledb.SparseVector.
|
|
205
|
+
|
|
206
|
+
.. versionadded:: 2.0.43
|
|
207
|
+
|
|
208
|
+
"""
|
|
209
|
+
|
|
210
|
+
def __init__(
|
|
211
|
+
self,
|
|
212
|
+
num_dimensions: int,
|
|
213
|
+
indices: Union[list, array.array],
|
|
214
|
+
values: Union[list, array.array],
|
|
215
|
+
):
|
|
216
|
+
if not isinstance(indices, array.array) or indices.typecode != "I":
|
|
217
|
+
indices = array.array("I", indices)
|
|
218
|
+
if not isinstance(values, array.array):
|
|
219
|
+
values = array.array("d", values)
|
|
220
|
+
if len(indices) != len(values):
|
|
221
|
+
raise TypeError("indices and values must be of the same length!")
|
|
222
|
+
|
|
223
|
+
self.num_dimensions = num_dimensions
|
|
224
|
+
self.indices = indices
|
|
225
|
+
self.values = values
|
|
226
|
+
|
|
227
|
+
def __str__(self):
|
|
228
|
+
return (
|
|
229
|
+
f"SparseVector(num_dimensions={self.num_dimensions}, "
|
|
230
|
+
f"size={len(self.indices)}, typecode={self.values.typecode})"
|
|
231
|
+
)
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
class VECTOR(types.TypeEngine):
|
|
235
|
+
"""Oracle VECTOR datatype.
|
|
236
|
+
|
|
237
|
+
For complete background on using this type, see
|
|
238
|
+
:ref:`oracle_vector_datatype`.
|
|
239
|
+
|
|
240
|
+
.. versionadded:: 2.0.41
|
|
241
|
+
|
|
242
|
+
"""
|
|
243
|
+
|
|
244
|
+
cache_ok = True
|
|
245
|
+
|
|
246
|
+
__visit_name__ = "VECTOR"
|
|
247
|
+
|
|
248
|
+
_typecode_map = {
|
|
249
|
+
VectorStorageFormat.INT8: "b", # Signed int
|
|
250
|
+
VectorStorageFormat.BINARY: "B", # Unsigned int
|
|
251
|
+
VectorStorageFormat.FLOAT32: "f", # Float
|
|
252
|
+
VectorStorageFormat.FLOAT64: "d", # Double
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
def __init__(self, dim=None, storage_format=None, storage_type=None):
|
|
256
|
+
"""Construct a VECTOR.
|
|
257
|
+
|
|
258
|
+
:param dim: integer. The dimension of the VECTOR datatype. This
|
|
259
|
+
should be an integer value.
|
|
260
|
+
|
|
261
|
+
:param storage_format: VectorStorageFormat. The VECTOR storage
|
|
262
|
+
type format. This should be Enum values form
|
|
263
|
+
:class:`.VectorStorageFormat` INT8, BINARY, FLOAT32, or FLOAT64.
|
|
264
|
+
|
|
265
|
+
:param storage_type: VectorStorageType. The Vector storage type. This
|
|
266
|
+
should be Enum values from :class:`.VectorStorageType` SPARSE or
|
|
267
|
+
DENSE.
|
|
268
|
+
|
|
269
|
+
"""
|
|
270
|
+
|
|
271
|
+
if dim is not None and not isinstance(dim, int):
|
|
272
|
+
raise TypeError("dim must be an integer")
|
|
273
|
+
if storage_format is not None and not isinstance(
|
|
274
|
+
storage_format, VectorStorageFormat
|
|
275
|
+
):
|
|
276
|
+
raise TypeError(
|
|
277
|
+
"storage_format must be an enum of type VectorStorageFormat"
|
|
278
|
+
)
|
|
279
|
+
if storage_type is not None and not isinstance(
|
|
280
|
+
storage_type, VectorStorageType
|
|
281
|
+
):
|
|
282
|
+
raise TypeError(
|
|
283
|
+
"storage_type must be an enum of type VectorStorageType"
|
|
284
|
+
)
|
|
285
|
+
|
|
286
|
+
self.dim = dim
|
|
287
|
+
self.storage_format = storage_format
|
|
288
|
+
self.storage_type = storage_type
|
|
289
|
+
|
|
290
|
+
def _cached_bind_processor(self, dialect):
|
|
291
|
+
"""
|
|
292
|
+
Converts a Python-side SparseVector instance into an
|
|
293
|
+
oracledb.SparseVectormor a compatible array format before
|
|
294
|
+
binding it to the database.
|
|
295
|
+
"""
|
|
296
|
+
|
|
297
|
+
def process(value):
|
|
298
|
+
if value is None or isinstance(value, array.array):
|
|
299
|
+
return value
|
|
300
|
+
|
|
301
|
+
# Convert list to a array.array
|
|
302
|
+
elif isinstance(value, list):
|
|
303
|
+
typecode = self._array_typecode(self.storage_format)
|
|
304
|
+
value = array.array(typecode, value)
|
|
305
|
+
return value
|
|
306
|
+
|
|
307
|
+
# Convert SqlAlchemy SparseVector to oracledb SparseVector object
|
|
308
|
+
elif isinstance(value, SparseVector):
|
|
309
|
+
return dialect.dbapi.SparseVector(
|
|
310
|
+
value.num_dimensions,
|
|
311
|
+
value.indices,
|
|
312
|
+
value.values,
|
|
313
|
+
)
|
|
314
|
+
|
|
315
|
+
else:
|
|
316
|
+
raise TypeError(
|
|
317
|
+
"""
|
|
318
|
+
Invalid input for VECTOR: expected a list, an array.array,
|
|
319
|
+
or a SparseVector object.
|
|
320
|
+
"""
|
|
321
|
+
)
|
|
322
|
+
|
|
323
|
+
return process
|
|
324
|
+
|
|
325
|
+
def _cached_result_processor(self, dialect, coltype):
|
|
326
|
+
"""
|
|
327
|
+
Converts database-returned values into Python-native representations.
|
|
328
|
+
If the value is an oracledb.SparseVector, it is converted into the
|
|
329
|
+
SQLAlchemy-side SparseVector class.
|
|
330
|
+
If the value is a array.array, it is converted to a plain Python list.
|
|
331
|
+
|
|
332
|
+
"""
|
|
333
|
+
|
|
334
|
+
def process(value):
|
|
335
|
+
if value is None:
|
|
336
|
+
return None
|
|
337
|
+
|
|
338
|
+
elif isinstance(value, array.array):
|
|
339
|
+
return list(value)
|
|
340
|
+
|
|
341
|
+
# Convert Oracledb SparseVector to SqlAlchemy SparseVector object
|
|
342
|
+
elif isinstance(value, dialect.dbapi.SparseVector):
|
|
343
|
+
return SparseVector(
|
|
344
|
+
num_dimensions=value.num_dimensions,
|
|
345
|
+
indices=value.indices,
|
|
346
|
+
values=value.values,
|
|
347
|
+
)
|
|
348
|
+
|
|
349
|
+
return process
|
|
350
|
+
|
|
351
|
+
def _array_typecode(self, typecode):
|
|
352
|
+
"""
|
|
353
|
+
Map storage format to array typecode.
|
|
354
|
+
"""
|
|
355
|
+
return self._typecode_map.get(typecode, "d")
|
|
356
|
+
|
|
357
|
+
class comparator_factory(types.TypeEngine.Comparator):
|
|
358
|
+
def l2_distance(self, other):
|
|
359
|
+
return self.op("<->", return_type=Float)(other)
|
|
360
|
+
|
|
361
|
+
def inner_product(self, other):
|
|
362
|
+
return self.op("<#>", return_type=Float)(other)
|
|
363
|
+
|
|
364
|
+
def cosine_distance(self, other):
|
|
365
|
+
return self.op("<=>", return_type=Float)(other)
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# dialects/postgresql/__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 types import ModuleType
|
|
10
|
+
|
|
11
|
+
from . import array as arraylib # noqa # keep above base and other dialects
|
|
12
|
+
from . import asyncpg # noqa
|
|
13
|
+
from . import base
|
|
14
|
+
from . import pg8000 # noqa
|
|
15
|
+
from . import psycopg # noqa
|
|
16
|
+
from . import psycopg2 # noqa
|
|
17
|
+
from . import psycopg2cffi # noqa
|
|
18
|
+
from .array import All
|
|
19
|
+
from .array import Any
|
|
20
|
+
from .array import ARRAY
|
|
21
|
+
from .array import array
|
|
22
|
+
from .base import BIGINT
|
|
23
|
+
from .base import BOOLEAN
|
|
24
|
+
from .base import CHAR
|
|
25
|
+
from .base import DATE
|
|
26
|
+
from .base import DOMAIN
|
|
27
|
+
from .base import DOUBLE_PRECISION
|
|
28
|
+
from .base import FLOAT
|
|
29
|
+
from .base import INTEGER
|
|
30
|
+
from .base import NUMERIC
|
|
31
|
+
from .base import REAL
|
|
32
|
+
from .base import SMALLINT
|
|
33
|
+
from .base import TEXT
|
|
34
|
+
from .base import UUID
|
|
35
|
+
from .base import VARCHAR
|
|
36
|
+
from .dml import Insert
|
|
37
|
+
from .dml import insert
|
|
38
|
+
from .ext import aggregate_order_by
|
|
39
|
+
from .ext import array_agg
|
|
40
|
+
from .ext import ExcludeConstraint
|
|
41
|
+
from .ext import phraseto_tsquery
|
|
42
|
+
from .ext import plainto_tsquery
|
|
43
|
+
from .ext import to_tsquery
|
|
44
|
+
from .ext import to_tsvector
|
|
45
|
+
from .ext import ts_headline
|
|
46
|
+
from .ext import websearch_to_tsquery
|
|
47
|
+
from .hstore import HSTORE
|
|
48
|
+
from .hstore import hstore
|
|
49
|
+
from .json import JSON
|
|
50
|
+
from .json import JSONB
|
|
51
|
+
from .json import JSONPATH
|
|
52
|
+
from .named_types import CreateDomainType
|
|
53
|
+
from .named_types import CreateEnumType
|
|
54
|
+
from .named_types import DropDomainType
|
|
55
|
+
from .named_types import DropEnumType
|
|
56
|
+
from .named_types import ENUM
|
|
57
|
+
from .named_types import NamedType
|
|
58
|
+
from .ranges import AbstractMultiRange
|
|
59
|
+
from .ranges import AbstractRange
|
|
60
|
+
from .ranges import AbstractSingleRange
|
|
61
|
+
from .ranges import DATEMULTIRANGE
|
|
62
|
+
from .ranges import DATERANGE
|
|
63
|
+
from .ranges import INT4MULTIRANGE
|
|
64
|
+
from .ranges import INT4RANGE
|
|
65
|
+
from .ranges import INT8MULTIRANGE
|
|
66
|
+
from .ranges import INT8RANGE
|
|
67
|
+
from .ranges import MultiRange
|
|
68
|
+
from .ranges import NUMMULTIRANGE
|
|
69
|
+
from .ranges import NUMRANGE
|
|
70
|
+
from .ranges import Range
|
|
71
|
+
from .ranges import TSMULTIRANGE
|
|
72
|
+
from .ranges import TSRANGE
|
|
73
|
+
from .ranges import TSTZMULTIRANGE
|
|
74
|
+
from .ranges import TSTZRANGE
|
|
75
|
+
from .types import BIT
|
|
76
|
+
from .types import BYTEA
|
|
77
|
+
from .types import CIDR
|
|
78
|
+
from .types import CITEXT
|
|
79
|
+
from .types import INET
|
|
80
|
+
from .types import INTERVAL
|
|
81
|
+
from .types import MACADDR
|
|
82
|
+
from .types import MACADDR8
|
|
83
|
+
from .types import MONEY
|
|
84
|
+
from .types import OID
|
|
85
|
+
from .types import REGCLASS
|
|
86
|
+
from .types import REGCONFIG
|
|
87
|
+
from .types import TIME
|
|
88
|
+
from .types import TIMESTAMP
|
|
89
|
+
from .types import TSQUERY
|
|
90
|
+
from .types import TSVECTOR
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
# Alias psycopg also as psycopg_async
|
|
94
|
+
psycopg_async = type(
|
|
95
|
+
"psycopg_async", (ModuleType,), {"dialect": psycopg.dialect_async}
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
base.dialect = dialect = psycopg2.dialect
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
__all__ = (
|
|
102
|
+
"INTEGER",
|
|
103
|
+
"BIGINT",
|
|
104
|
+
"SMALLINT",
|
|
105
|
+
"VARCHAR",
|
|
106
|
+
"CHAR",
|
|
107
|
+
"TEXT",
|
|
108
|
+
"NUMERIC",
|
|
109
|
+
"FLOAT",
|
|
110
|
+
"REAL",
|
|
111
|
+
"INET",
|
|
112
|
+
"CIDR",
|
|
113
|
+
"CITEXT",
|
|
114
|
+
"UUID",
|
|
115
|
+
"BIT",
|
|
116
|
+
"MACADDR",
|
|
117
|
+
"MACADDR8",
|
|
118
|
+
"MONEY",
|
|
119
|
+
"OID",
|
|
120
|
+
"REGCLASS",
|
|
121
|
+
"REGCONFIG",
|
|
122
|
+
"TSQUERY",
|
|
123
|
+
"TSVECTOR",
|
|
124
|
+
"DOUBLE_PRECISION",
|
|
125
|
+
"TIMESTAMP",
|
|
126
|
+
"TIME",
|
|
127
|
+
"DATE",
|
|
128
|
+
"BYTEA",
|
|
129
|
+
"BOOLEAN",
|
|
130
|
+
"INTERVAL",
|
|
131
|
+
"ARRAY",
|
|
132
|
+
"ENUM",
|
|
133
|
+
"DOMAIN",
|
|
134
|
+
"dialect",
|
|
135
|
+
"array",
|
|
136
|
+
"HSTORE",
|
|
137
|
+
"hstore",
|
|
138
|
+
"INT4RANGE",
|
|
139
|
+
"INT8RANGE",
|
|
140
|
+
"NUMRANGE",
|
|
141
|
+
"DATERANGE",
|
|
142
|
+
"INT4MULTIRANGE",
|
|
143
|
+
"INT8MULTIRANGE",
|
|
144
|
+
"NUMMULTIRANGE",
|
|
145
|
+
"DATEMULTIRANGE",
|
|
146
|
+
"TSVECTOR",
|
|
147
|
+
"TSRANGE",
|
|
148
|
+
"TSTZRANGE",
|
|
149
|
+
"TSMULTIRANGE",
|
|
150
|
+
"TSTZMULTIRANGE",
|
|
151
|
+
"JSON",
|
|
152
|
+
"JSONB",
|
|
153
|
+
"JSONPATH",
|
|
154
|
+
"Any",
|
|
155
|
+
"All",
|
|
156
|
+
"DropEnumType",
|
|
157
|
+
"DropDomainType",
|
|
158
|
+
"CreateDomainType",
|
|
159
|
+
"NamedType",
|
|
160
|
+
"CreateEnumType",
|
|
161
|
+
"ExcludeConstraint",
|
|
162
|
+
"Range",
|
|
163
|
+
"aggregate_order_by",
|
|
164
|
+
"array_agg",
|
|
165
|
+
"insert",
|
|
166
|
+
"Insert",
|
|
167
|
+
)
|