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.
- sqlalchemy/__init__.py +298 -0
- sqlalchemy/connectors/__init__.py +18 -0
- sqlalchemy/connectors/aioodbc.py +171 -0
- sqlalchemy/connectors/asyncio.py +476 -0
- sqlalchemy/connectors/pyodbc.py +250 -0
- sqlalchemy/dialects/__init__.py +62 -0
- sqlalchemy/dialects/_typing.py +30 -0
- sqlalchemy/dialects/mssql/__init__.py +89 -0
- sqlalchemy/dialects/mssql/aioodbc.py +63 -0
- sqlalchemy/dialects/mssql/base.py +4166 -0
- sqlalchemy/dialects/mssql/information_schema.py +285 -0
- sqlalchemy/dialects/mssql/json.py +140 -0
- sqlalchemy/dialects/mssql/mssqlpython.py +220 -0
- sqlalchemy/dialects/mssql/provision.py +196 -0
- sqlalchemy/dialects/mssql/pymssql.py +126 -0
- sqlalchemy/dialects/mssql/pyodbc.py +698 -0
- sqlalchemy/dialects/mysql/__init__.py +106 -0
- sqlalchemy/dialects/mysql/_mariadb_shim.py +312 -0
- sqlalchemy/dialects/mysql/aiomysql.py +226 -0
- sqlalchemy/dialects/mysql/asyncmy.py +214 -0
- sqlalchemy/dialects/mysql/base.py +3877 -0
- sqlalchemy/dialects/mysql/cymysql.py +106 -0
- sqlalchemy/dialects/mysql/dml.py +279 -0
- sqlalchemy/dialects/mysql/enumerated.py +277 -0
- sqlalchemy/dialects/mysql/expression.py +146 -0
- sqlalchemy/dialects/mysql/json.py +92 -0
- sqlalchemy/dialects/mysql/mariadb.py +67 -0
- sqlalchemy/dialects/mysql/mariadbconnector.py +330 -0
- sqlalchemy/dialects/mysql/mysqlconnector.py +296 -0
- sqlalchemy/dialects/mysql/mysqldb.py +312 -0
- sqlalchemy/dialects/mysql/provision.py +153 -0
- sqlalchemy/dialects/mysql/pymysql.py +157 -0
- sqlalchemy/dialects/mysql/pyodbc.py +156 -0
- sqlalchemy/dialects/mysql/reflection.py +724 -0
- sqlalchemy/dialects/mysql/reserved_words.py +570 -0
- sqlalchemy/dialects/mysql/types.py +845 -0
- sqlalchemy/dialects/oracle/__init__.py +85 -0
- sqlalchemy/dialects/oracle/base.py +3977 -0
- sqlalchemy/dialects/oracle/cx_oracle.py +1601 -0
- sqlalchemy/dialects/oracle/dictionary.py +507 -0
- sqlalchemy/dialects/oracle/json.py +158 -0
- sqlalchemy/dialects/oracle/oracledb.py +909 -0
- sqlalchemy/dialects/oracle/provision.py +288 -0
- sqlalchemy/dialects/oracle/types.py +367 -0
- sqlalchemy/dialects/oracle/vector.py +368 -0
- sqlalchemy/dialects/postgresql/__init__.py +171 -0
- sqlalchemy/dialects/postgresql/_psycopg_common.py +229 -0
- sqlalchemy/dialects/postgresql/array.py +534 -0
- sqlalchemy/dialects/postgresql/asyncpg.py +1323 -0
- sqlalchemy/dialects/postgresql/base.py +5789 -0
- sqlalchemy/dialects/postgresql/bitstring.py +327 -0
- sqlalchemy/dialects/postgresql/dml.py +360 -0
- sqlalchemy/dialects/postgresql/ext.py +593 -0
- sqlalchemy/dialects/postgresql/hstore.py +423 -0
- sqlalchemy/dialects/postgresql/json.py +408 -0
- sqlalchemy/dialects/postgresql/named_types.py +521 -0
- sqlalchemy/dialects/postgresql/operators.py +130 -0
- sqlalchemy/dialects/postgresql/pg8000.py +670 -0
- sqlalchemy/dialects/postgresql/pg_catalog.py +344 -0
- sqlalchemy/dialects/postgresql/provision.py +184 -0
- sqlalchemy/dialects/postgresql/psycopg.py +799 -0
- sqlalchemy/dialects/postgresql/psycopg2.py +860 -0
- sqlalchemy/dialects/postgresql/psycopg2cffi.py +61 -0
- sqlalchemy/dialects/postgresql/ranges.py +1002 -0
- sqlalchemy/dialects/postgresql/types.py +388 -0
- sqlalchemy/dialects/sqlite/__init__.py +57 -0
- sqlalchemy/dialects/sqlite/aiosqlite.py +321 -0
- sqlalchemy/dialects/sqlite/base.py +3063 -0
- sqlalchemy/dialects/sqlite/dml.py +279 -0
- sqlalchemy/dialects/sqlite/json.py +100 -0
- sqlalchemy/dialects/sqlite/provision.py +229 -0
- sqlalchemy/dialects/sqlite/pysqlcipher.py +161 -0
- sqlalchemy/dialects/sqlite/pysqlite.py +754 -0
- sqlalchemy/dialects/type_migration_guidelines.txt +145 -0
- sqlalchemy/engine/__init__.py +62 -0
- sqlalchemy/engine/_processors_cy.cp313t-win_arm64.pyd +0 -0
- sqlalchemy/engine/_processors_cy.py +92 -0
- sqlalchemy/engine/_result_cy.cp313t-win_arm64.pyd +0 -0
- sqlalchemy/engine/_result_cy.py +633 -0
- sqlalchemy/engine/_row_cy.cp313t-win_arm64.pyd +0 -0
- sqlalchemy/engine/_row_cy.py +232 -0
- sqlalchemy/engine/_util_cy.cp313t-win_arm64.pyd +0 -0
- sqlalchemy/engine/_util_cy.py +136 -0
- sqlalchemy/engine/base.py +3354 -0
- sqlalchemy/engine/characteristics.py +155 -0
- sqlalchemy/engine/create.py +877 -0
- sqlalchemy/engine/cursor.py +2421 -0
- sqlalchemy/engine/default.py +2402 -0
- sqlalchemy/engine/events.py +965 -0
- sqlalchemy/engine/interfaces.py +3495 -0
- sqlalchemy/engine/mock.py +134 -0
- sqlalchemy/engine/processors.py +82 -0
- sqlalchemy/engine/reflection.py +2100 -0
- sqlalchemy/engine/result.py +1966 -0
- sqlalchemy/engine/row.py +397 -0
- sqlalchemy/engine/strategies.py +16 -0
- sqlalchemy/engine/url.py +922 -0
- sqlalchemy/engine/util.py +156 -0
- sqlalchemy/event/__init__.py +26 -0
- sqlalchemy/event/api.py +220 -0
- sqlalchemy/event/attr.py +674 -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 +922 -0
- sqlalchemy/ext/__init__.py +11 -0
- sqlalchemy/ext/associationproxy.py +2072 -0
- sqlalchemy/ext/asyncio/__init__.py +29 -0
- sqlalchemy/ext/asyncio/base.py +281 -0
- sqlalchemy/ext/asyncio/engine.py +1487 -0
- sqlalchemy/ext/asyncio/exc.py +21 -0
- sqlalchemy/ext/asyncio/result.py +994 -0
- sqlalchemy/ext/asyncio/scoping.py +1679 -0
- sqlalchemy/ext/asyncio/session.py +2007 -0
- sqlalchemy/ext/automap.py +1701 -0
- sqlalchemy/ext/baked.py +559 -0
- sqlalchemy/ext/compiler.py +600 -0
- sqlalchemy/ext/declarative/__init__.py +65 -0
- sqlalchemy/ext/declarative/extensions.py +560 -0
- sqlalchemy/ext/horizontal_shard.py +481 -0
- sqlalchemy/ext/hybrid.py +1877 -0
- sqlalchemy/ext/indexable.py +364 -0
- sqlalchemy/ext/instrumentation.py +450 -0
- sqlalchemy/ext/mutable.py +1081 -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 +283 -0
- sqlalchemy/orm/__init__.py +176 -0
- sqlalchemy/orm/_orm_constructors.py +2694 -0
- sqlalchemy/orm/_typing.py +179 -0
- sqlalchemy/orm/attributes.py +2868 -0
- sqlalchemy/orm/base.py +976 -0
- sqlalchemy/orm/bulk_persistence.py +2152 -0
- sqlalchemy/orm/clsregistry.py +582 -0
- sqlalchemy/orm/collections.py +1568 -0
- sqlalchemy/orm/context.py +3471 -0
- sqlalchemy/orm/decl_api.py +2280 -0
- sqlalchemy/orm/decl_base.py +2309 -0
- sqlalchemy/orm/dependency.py +1306 -0
- sqlalchemy/orm/descriptor_props.py +1183 -0
- sqlalchemy/orm/dynamic.py +307 -0
- sqlalchemy/orm/evaluator.py +379 -0
- sqlalchemy/orm/events.py +3386 -0
- sqlalchemy/orm/exc.py +237 -0
- sqlalchemy/orm/identity.py +302 -0
- sqlalchemy/orm/instrumentation.py +746 -0
- sqlalchemy/orm/interfaces.py +1589 -0
- sqlalchemy/orm/loading.py +1684 -0
- sqlalchemy/orm/mapped_collection.py +557 -0
- sqlalchemy/orm/mapper.py +4411 -0
- sqlalchemy/orm/path_registry.py +829 -0
- sqlalchemy/orm/persistence.py +1789 -0
- sqlalchemy/orm/properties.py +973 -0
- sqlalchemy/orm/query.py +3528 -0
- sqlalchemy/orm/relationships.py +3570 -0
- sqlalchemy/orm/scoping.py +2232 -0
- sqlalchemy/orm/session.py +5403 -0
- sqlalchemy/orm/state.py +1175 -0
- sqlalchemy/orm/state_changes.py +196 -0
- sqlalchemy/orm/strategies.py +3492 -0
- sqlalchemy/orm/strategy_options.py +2562 -0
- sqlalchemy/orm/sync.py +164 -0
- sqlalchemy/orm/unitofwork.py +798 -0
- sqlalchemy/orm/util.py +2438 -0
- sqlalchemy/orm/writeonly.py +694 -0
- sqlalchemy/pool/__init__.py +41 -0
- sqlalchemy/pool/base.py +1522 -0
- sqlalchemy/pool/events.py +375 -0
- sqlalchemy/pool/impl.py +582 -0
- sqlalchemy/py.typed +0 -0
- sqlalchemy/schema.py +74 -0
- sqlalchemy/sql/__init__.py +156 -0
- sqlalchemy/sql/_annotated_cols.py +397 -0
- sqlalchemy/sql/_dml_constructors.py +132 -0
- sqlalchemy/sql/_elements_constructors.py +2164 -0
- sqlalchemy/sql/_orm_types.py +20 -0
- sqlalchemy/sql/_selectable_constructors.py +840 -0
- sqlalchemy/sql/_typing.py +487 -0
- sqlalchemy/sql/_util_cy.cp313t-win_arm64.pyd +0 -0
- sqlalchemy/sql/_util_cy.py +127 -0
- sqlalchemy/sql/annotation.py +590 -0
- sqlalchemy/sql/base.py +2699 -0
- sqlalchemy/sql/cache_key.py +1066 -0
- sqlalchemy/sql/coercions.py +1373 -0
- sqlalchemy/sql/compiler.py +8327 -0
- sqlalchemy/sql/crud.py +1815 -0
- sqlalchemy/sql/ddl.py +1928 -0
- sqlalchemy/sql/default_comparator.py +654 -0
- sqlalchemy/sql/dml.py +1977 -0
- sqlalchemy/sql/elements.py +6033 -0
- sqlalchemy/sql/events.py +458 -0
- sqlalchemy/sql/expression.py +172 -0
- sqlalchemy/sql/functions.py +2305 -0
- sqlalchemy/sql/lambdas.py +1443 -0
- sqlalchemy/sql/naming.py +209 -0
- sqlalchemy/sql/operators.py +2897 -0
- sqlalchemy/sql/roles.py +332 -0
- sqlalchemy/sql/schema.py +6703 -0
- sqlalchemy/sql/selectable.py +7553 -0
- sqlalchemy/sql/sqltypes.py +4093 -0
- sqlalchemy/sql/traversals.py +1042 -0
- sqlalchemy/sql/type_api.py +2446 -0
- sqlalchemy/sql/util.py +1495 -0
- sqlalchemy/sql/visitors.py +1157 -0
- sqlalchemy/testing/__init__.py +96 -0
- sqlalchemy/testing/assertions.py +1007 -0
- sqlalchemy/testing/assertsql.py +519 -0
- sqlalchemy/testing/asyncio.py +128 -0
- sqlalchemy/testing/config.py +440 -0
- sqlalchemy/testing/engines.py +483 -0
- sqlalchemy/testing/entities.py +117 -0
- sqlalchemy/testing/exclusions.py +476 -0
- sqlalchemy/testing/fixtures/__init__.py +30 -0
- sqlalchemy/testing/fixtures/base.py +384 -0
- sqlalchemy/testing/fixtures/mypy.py +247 -0
- sqlalchemy/testing/fixtures/orm.py +227 -0
- sqlalchemy/testing/fixtures/sql.py +538 -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 +613 -0
- sqlalchemy/testing/requirements.py +1978 -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 +420 -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 +660 -0
- sqlalchemy/testing/suite/test_rowcount.py +258 -0
- sqlalchemy/testing/suite/test_select.py +2112 -0
- sqlalchemy/testing/suite/test_sequence.py +317 -0
- sqlalchemy/testing/suite/test_table_via_select.py +686 -0
- sqlalchemy/testing/suite/test_types.py +2271 -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 +76 -0
- sqlalchemy/util/__init__.py +158 -0
- sqlalchemy/util/_collections.py +688 -0
- sqlalchemy/util/_collections_cy.cp313t-win_arm64.pyd +0 -0
- sqlalchemy/util/_collections_cy.pxd +8 -0
- sqlalchemy/util/_collections_cy.py +516 -0
- sqlalchemy/util/_has_cython.py +46 -0
- sqlalchemy/util/_immutabledict_cy.cp313t-win_arm64.pyd +0 -0
- sqlalchemy/util/_immutabledict_cy.py +240 -0
- sqlalchemy/util/compat.py +299 -0
- sqlalchemy/util/concurrency.py +322 -0
- sqlalchemy/util/cython.py +79 -0
- sqlalchemy/util/deprecations.py +401 -0
- sqlalchemy/util/langhelpers.py +2320 -0
- sqlalchemy/util/preloaded.py +152 -0
- sqlalchemy/util/queue.py +304 -0
- sqlalchemy/util/tool_support.py +201 -0
- sqlalchemy/util/topological.py +120 -0
- sqlalchemy/util/typing.py +711 -0
- sqlalchemy-2.1.0b2.dist-info/METADATA +269 -0
- sqlalchemy-2.1.0b2.dist-info/RECORD +270 -0
- sqlalchemy-2.1.0b2.dist-info/WHEEL +5 -0
- sqlalchemy-2.1.0b2.dist-info/licenses/LICENSE +19 -0
- sqlalchemy-2.1.0b2.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
# dialects/postgresql/types.py
|
|
2
|
+
# Copyright (C) 2013-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
|
+
import datetime as dt
|
|
10
|
+
from typing import Any
|
|
11
|
+
from typing import Literal
|
|
12
|
+
from typing import Optional
|
|
13
|
+
from typing import overload
|
|
14
|
+
from typing import Type
|
|
15
|
+
from typing import TYPE_CHECKING
|
|
16
|
+
from uuid import UUID as _python_UUID
|
|
17
|
+
|
|
18
|
+
from .bitstring import BitString
|
|
19
|
+
from ...sql import sqltypes
|
|
20
|
+
from ...sql import type_api
|
|
21
|
+
from ...sql.type_api import TypeEngine
|
|
22
|
+
from ...types import OperatorClass
|
|
23
|
+
|
|
24
|
+
if TYPE_CHECKING:
|
|
25
|
+
from ...engine.interfaces import Dialect
|
|
26
|
+
from ...sql.operators import ColumnOperators
|
|
27
|
+
from ...sql.operators import OperatorType
|
|
28
|
+
from ...sql.type_api import _BindProcessorType
|
|
29
|
+
from ...sql.type_api import _LiteralProcessorType
|
|
30
|
+
from ...sql.type_api import _ResultProcessorType
|
|
31
|
+
|
|
32
|
+
_DECIMAL_TYPES = (1231, 1700)
|
|
33
|
+
_FLOAT_TYPES = (700, 701, 1021, 1022)
|
|
34
|
+
_INT_TYPES = (20, 21, 23, 26, 1005, 1007, 1016)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class PGUuid(sqltypes.UUID[sqltypes._UUID_RETURN]):
|
|
38
|
+
render_bind_cast = True
|
|
39
|
+
render_literal_cast = True
|
|
40
|
+
|
|
41
|
+
if TYPE_CHECKING:
|
|
42
|
+
|
|
43
|
+
@overload
|
|
44
|
+
def __init__(
|
|
45
|
+
self: PGUuid[_python_UUID], as_uuid: Literal[True] = ...
|
|
46
|
+
) -> None: ...
|
|
47
|
+
|
|
48
|
+
@overload
|
|
49
|
+
def __init__(
|
|
50
|
+
self: PGUuid[str], as_uuid: Literal[False] = ...
|
|
51
|
+
) -> None: ...
|
|
52
|
+
|
|
53
|
+
def __init__(self, as_uuid: bool = True) -> None: ...
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class BYTEA(sqltypes.LargeBinary):
|
|
57
|
+
__visit_name__ = "BYTEA"
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class _NetworkAddressTypeMixin:
|
|
61
|
+
operator_classes = OperatorClass.BASE | OperatorClass.COMPARISON
|
|
62
|
+
|
|
63
|
+
def coerce_compared_value(
|
|
64
|
+
self, op: Optional[OperatorType], value: Any
|
|
65
|
+
) -> TypeEngine[Any]:
|
|
66
|
+
if TYPE_CHECKING:
|
|
67
|
+
assert isinstance(self, TypeEngine)
|
|
68
|
+
return self
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
class INET(_NetworkAddressTypeMixin, sqltypes.TypeEngine[str]):
|
|
72
|
+
__visit_name__ = "INET"
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
PGInet = INET
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class CIDR(_NetworkAddressTypeMixin, sqltypes.TypeEngine[str]):
|
|
79
|
+
__visit_name__ = "CIDR"
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
PGCidr = CIDR
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class MACADDR(_NetworkAddressTypeMixin, sqltypes.TypeEngine[str]):
|
|
86
|
+
__visit_name__ = "MACADDR"
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
PGMacAddr = MACADDR
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
class MACADDR8(_NetworkAddressTypeMixin, sqltypes.TypeEngine[str]):
|
|
93
|
+
__visit_name__ = "MACADDR8"
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
PGMacAddr8 = MACADDR8
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
class MONEY(sqltypes.TypeEngine[str]):
|
|
100
|
+
r"""Provide the PostgreSQL MONEY type.
|
|
101
|
+
|
|
102
|
+
Depending on driver, result rows using this type may return a
|
|
103
|
+
string value which includes currency symbols.
|
|
104
|
+
|
|
105
|
+
For this reason, it may be preferable to provide conversion to a
|
|
106
|
+
numerically-based currency datatype using :class:`_types.TypeDecorator`::
|
|
107
|
+
|
|
108
|
+
import re
|
|
109
|
+
import decimal
|
|
110
|
+
from sqlalchemy import Dialect
|
|
111
|
+
from sqlalchemy import TypeDecorator
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
class NumericMoney(TypeDecorator):
|
|
115
|
+
impl = MONEY
|
|
116
|
+
|
|
117
|
+
def process_result_value(self, value: Any, dialect: Dialect) -> None:
|
|
118
|
+
if value is not None:
|
|
119
|
+
# adjust this for the currency and numeric
|
|
120
|
+
m = re.match(r"\$([\d.]+)", value)
|
|
121
|
+
if m:
|
|
122
|
+
value = decimal.Decimal(m.group(1))
|
|
123
|
+
return value
|
|
124
|
+
|
|
125
|
+
Alternatively, the conversion may be applied as a CAST using
|
|
126
|
+
the :meth:`_types.TypeDecorator.column_expression` method as follows::
|
|
127
|
+
|
|
128
|
+
import decimal
|
|
129
|
+
from sqlalchemy import cast
|
|
130
|
+
from sqlalchemy import TypeDecorator
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
class NumericMoney(TypeDecorator):
|
|
134
|
+
impl = MONEY
|
|
135
|
+
|
|
136
|
+
def column_expression(self, column: Any):
|
|
137
|
+
return cast(column, Numeric())
|
|
138
|
+
|
|
139
|
+
""" # noqa: E501
|
|
140
|
+
|
|
141
|
+
__visit_name__ = "MONEY"
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
class OID(sqltypes.TypeEngine[int]):
|
|
145
|
+
"""Provide the PostgreSQL OID type."""
|
|
146
|
+
|
|
147
|
+
__visit_name__ = "OID"
|
|
148
|
+
|
|
149
|
+
operator_classes = OperatorClass.BASE | OperatorClass.COMPARISON
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
class REGCONFIG(sqltypes.TypeEngine[str]):
|
|
153
|
+
"""Provide the PostgreSQL REGCONFIG type.
|
|
154
|
+
|
|
155
|
+
.. versionadded:: 2.0.0rc1
|
|
156
|
+
|
|
157
|
+
"""
|
|
158
|
+
|
|
159
|
+
__visit_name__ = "REGCONFIG"
|
|
160
|
+
|
|
161
|
+
operator_classes = OperatorClass.BASE | OperatorClass.COMPARISON
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
class TSQUERY(sqltypes.TypeEngine[str]):
|
|
165
|
+
"""Provide the PostgreSQL TSQUERY type.
|
|
166
|
+
|
|
167
|
+
.. versionadded:: 2.0.0rc1
|
|
168
|
+
|
|
169
|
+
"""
|
|
170
|
+
|
|
171
|
+
__visit_name__ = "TSQUERY"
|
|
172
|
+
|
|
173
|
+
operator_classes = OperatorClass.BASE | OperatorClass.COMPARISON
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
class REGCLASS(sqltypes.TypeEngine[str]):
|
|
177
|
+
"""Provide the PostgreSQL REGCLASS type."""
|
|
178
|
+
|
|
179
|
+
__visit_name__ = "REGCLASS"
|
|
180
|
+
|
|
181
|
+
operator_classes = OperatorClass.BASE | OperatorClass.COMPARISON
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
class TIMESTAMP(sqltypes.TIMESTAMP):
|
|
185
|
+
"""Provide the PostgreSQL TIMESTAMP type."""
|
|
186
|
+
|
|
187
|
+
__visit_name__ = "TIMESTAMP"
|
|
188
|
+
|
|
189
|
+
def __init__(
|
|
190
|
+
self, timezone: bool = False, precision: Optional[int] = None
|
|
191
|
+
) -> None:
|
|
192
|
+
"""Construct a TIMESTAMP.
|
|
193
|
+
|
|
194
|
+
:param timezone: boolean value if timezone present, default False
|
|
195
|
+
:param precision: optional integer precision value
|
|
196
|
+
|
|
197
|
+
.. versionadded:: 1.4
|
|
198
|
+
|
|
199
|
+
"""
|
|
200
|
+
super().__init__(timezone=timezone)
|
|
201
|
+
self.precision = precision
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
class TIME(sqltypes.TIME):
|
|
205
|
+
"""PostgreSQL TIME type."""
|
|
206
|
+
|
|
207
|
+
__visit_name__ = "TIME"
|
|
208
|
+
|
|
209
|
+
def __init__(
|
|
210
|
+
self, timezone: bool = False, precision: Optional[int] = None
|
|
211
|
+
) -> None:
|
|
212
|
+
"""Construct a TIME.
|
|
213
|
+
|
|
214
|
+
:param timezone: boolean value if timezone present, default False
|
|
215
|
+
:param precision: optional integer precision value
|
|
216
|
+
|
|
217
|
+
.. versionadded:: 1.4
|
|
218
|
+
|
|
219
|
+
"""
|
|
220
|
+
super().__init__(timezone=timezone)
|
|
221
|
+
self.precision = precision
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
class INTERVAL(type_api.NativeForEmulated, sqltypes._AbstractInterval):
|
|
225
|
+
"""PostgreSQL INTERVAL type."""
|
|
226
|
+
|
|
227
|
+
__visit_name__ = "INTERVAL"
|
|
228
|
+
native = True
|
|
229
|
+
|
|
230
|
+
def __init__(
|
|
231
|
+
self, precision: Optional[int] = None, fields: Optional[str] = None
|
|
232
|
+
) -> None:
|
|
233
|
+
"""Construct an INTERVAL.
|
|
234
|
+
|
|
235
|
+
:param precision: optional integer precision value
|
|
236
|
+
:param fields: string fields specifier. allows storage of fields
|
|
237
|
+
to be limited, such as ``"YEAR"``, ``"MONTH"``, ``"DAY TO HOUR"``,
|
|
238
|
+
etc.
|
|
239
|
+
|
|
240
|
+
"""
|
|
241
|
+
self.precision = precision
|
|
242
|
+
self.fields = fields
|
|
243
|
+
|
|
244
|
+
@classmethod
|
|
245
|
+
def adapt_emulated_to_native(
|
|
246
|
+
cls, interval: sqltypes.Interval, **kw: Any # type: ignore[override]
|
|
247
|
+
) -> INTERVAL:
|
|
248
|
+
return INTERVAL(precision=interval.second_precision)
|
|
249
|
+
|
|
250
|
+
@property
|
|
251
|
+
def _type_affinity(self) -> Type[sqltypes.Interval]:
|
|
252
|
+
return sqltypes.Interval
|
|
253
|
+
|
|
254
|
+
def as_generic(self, allow_nulltype: bool = False) -> sqltypes.Interval:
|
|
255
|
+
return sqltypes.Interval(native=True, second_precision=self.precision)
|
|
256
|
+
|
|
257
|
+
@property
|
|
258
|
+
def python_type(self) -> Type[dt.timedelta]:
|
|
259
|
+
return dt.timedelta
|
|
260
|
+
|
|
261
|
+
def literal_processor(
|
|
262
|
+
self, dialect: Dialect
|
|
263
|
+
) -> Optional[_LiteralProcessorType[dt.timedelta]]:
|
|
264
|
+
def process(value: dt.timedelta) -> str:
|
|
265
|
+
return f"make_interval(secs=>{value.total_seconds()})"
|
|
266
|
+
|
|
267
|
+
return process
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
PGInterval = INTERVAL
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
class BIT(sqltypes.TypeEngine[BitString]):
|
|
274
|
+
"""Represent the PostgreSQL BIT type.
|
|
275
|
+
|
|
276
|
+
The :class:`_postgresql.BIT` type yields values in the form of the
|
|
277
|
+
:class:`_postgresql.BitString` Python value type.
|
|
278
|
+
|
|
279
|
+
.. versionchanged:: 2.1 The :class:`_postgresql.BIT` type now works
|
|
280
|
+
with :class:`_postgresql.BitString` values rather than plain strings.
|
|
281
|
+
|
|
282
|
+
"""
|
|
283
|
+
|
|
284
|
+
render_bind_cast = True
|
|
285
|
+
__visit_name__ = "BIT"
|
|
286
|
+
|
|
287
|
+
operator_classes = (
|
|
288
|
+
OperatorClass.BASE | OperatorClass.COMPARISON | OperatorClass.BITWISE
|
|
289
|
+
)
|
|
290
|
+
|
|
291
|
+
def __init__(
|
|
292
|
+
self, length: Optional[int] = None, varying: bool = False
|
|
293
|
+
) -> None:
|
|
294
|
+
if varying:
|
|
295
|
+
# BIT VARYING can be unlimited-length, so no default
|
|
296
|
+
self.length = length
|
|
297
|
+
else:
|
|
298
|
+
# BIT without VARYING defaults to length 1
|
|
299
|
+
self.length = length or 1
|
|
300
|
+
self.varying = varying
|
|
301
|
+
|
|
302
|
+
def bind_processor(
|
|
303
|
+
self, dialect: Dialect
|
|
304
|
+
) -> _BindProcessorType[BitString]:
|
|
305
|
+
def bound_value(value: Any) -> Any:
|
|
306
|
+
if isinstance(value, BitString):
|
|
307
|
+
return str(value)
|
|
308
|
+
return value
|
|
309
|
+
|
|
310
|
+
return bound_value
|
|
311
|
+
|
|
312
|
+
def result_processor(
|
|
313
|
+
self, dialect: Dialect, coltype: object
|
|
314
|
+
) -> _ResultProcessorType[BitString]:
|
|
315
|
+
def from_result_value(value: Any) -> Any:
|
|
316
|
+
if value is not None:
|
|
317
|
+
value = BitString(value)
|
|
318
|
+
return value
|
|
319
|
+
|
|
320
|
+
return from_result_value
|
|
321
|
+
|
|
322
|
+
def coerce_compared_value(
|
|
323
|
+
self, op: OperatorType | None, value: Any
|
|
324
|
+
) -> TypeEngine[Any]:
|
|
325
|
+
if isinstance(value, str):
|
|
326
|
+
return self
|
|
327
|
+
return super().coerce_compared_value(op, value)
|
|
328
|
+
|
|
329
|
+
@property
|
|
330
|
+
def python_type(self) -> type[Any]:
|
|
331
|
+
return BitString
|
|
332
|
+
|
|
333
|
+
class comparator_factory(TypeEngine.Comparator[BitString]):
|
|
334
|
+
def __lshift__(self, other: Any) -> ColumnOperators:
|
|
335
|
+
return self.bitwise_lshift(other)
|
|
336
|
+
|
|
337
|
+
def __rshift__(self, other: Any) -> ColumnOperators:
|
|
338
|
+
return self.bitwise_rshift(other)
|
|
339
|
+
|
|
340
|
+
def __and__(self, other: Any) -> ColumnOperators:
|
|
341
|
+
return self.bitwise_and(other)
|
|
342
|
+
|
|
343
|
+
def __or__(self, other: Any) -> ColumnOperators:
|
|
344
|
+
return self.bitwise_or(other)
|
|
345
|
+
|
|
346
|
+
# NOTE: __xor__ is not defined on sql.operators.ColumnOperators.
|
|
347
|
+
# Use `bitwise_xor` directly instead.
|
|
348
|
+
# def __xor__(self, other: Any) -> ColumnOperators:
|
|
349
|
+
# return self.bitwise_xor(other)
|
|
350
|
+
|
|
351
|
+
def __invert__(self) -> ColumnOperators:
|
|
352
|
+
return self.bitwise_not()
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
PGBit = BIT
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
class TSVECTOR(sqltypes.TypeEngine[str]):
|
|
359
|
+
"""The :class:`_postgresql.TSVECTOR` type implements the PostgreSQL
|
|
360
|
+
text search type TSVECTOR.
|
|
361
|
+
|
|
362
|
+
It can be used to do full text queries on natural language
|
|
363
|
+
documents.
|
|
364
|
+
|
|
365
|
+
.. seealso::
|
|
366
|
+
|
|
367
|
+
:ref:`postgresql_match`
|
|
368
|
+
|
|
369
|
+
"""
|
|
370
|
+
|
|
371
|
+
__visit_name__ = "TSVECTOR"
|
|
372
|
+
|
|
373
|
+
operator_classes = OperatorClass.STRING
|
|
374
|
+
|
|
375
|
+
|
|
376
|
+
class CITEXT(sqltypes.TEXT):
|
|
377
|
+
"""Provide the PostgreSQL CITEXT type.
|
|
378
|
+
|
|
379
|
+
.. versionadded:: 2.0.7
|
|
380
|
+
|
|
381
|
+
"""
|
|
382
|
+
|
|
383
|
+
__visit_name__ = "CITEXT"
|
|
384
|
+
|
|
385
|
+
def coerce_compared_value(
|
|
386
|
+
self, op: Optional[OperatorType], value: Any
|
|
387
|
+
) -> TypeEngine[Any]:
|
|
388
|
+
return self
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# dialects/sqlite/__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
|
+
|
|
10
|
+
from . import aiosqlite # noqa
|
|
11
|
+
from . import base # noqa
|
|
12
|
+
from . import pysqlcipher # noqa
|
|
13
|
+
from . import pysqlite # noqa
|
|
14
|
+
from .base import BLOB
|
|
15
|
+
from .base import BOOLEAN
|
|
16
|
+
from .base import CHAR
|
|
17
|
+
from .base import DATE
|
|
18
|
+
from .base import DATETIME
|
|
19
|
+
from .base import DECIMAL
|
|
20
|
+
from .base import FLOAT
|
|
21
|
+
from .base import INTEGER
|
|
22
|
+
from .base import JSON
|
|
23
|
+
from .base import NUMERIC
|
|
24
|
+
from .base import REAL
|
|
25
|
+
from .base import SMALLINT
|
|
26
|
+
from .base import TEXT
|
|
27
|
+
from .base import TIME
|
|
28
|
+
from .base import TIMESTAMP
|
|
29
|
+
from .base import VARCHAR
|
|
30
|
+
from .dml import Insert
|
|
31
|
+
from .dml import insert
|
|
32
|
+
|
|
33
|
+
# default dialect
|
|
34
|
+
base.dialect = dialect = pysqlite.dialect
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
__all__ = (
|
|
38
|
+
"BLOB",
|
|
39
|
+
"BOOLEAN",
|
|
40
|
+
"CHAR",
|
|
41
|
+
"DATE",
|
|
42
|
+
"DATETIME",
|
|
43
|
+
"DECIMAL",
|
|
44
|
+
"FLOAT",
|
|
45
|
+
"INTEGER",
|
|
46
|
+
"JSON",
|
|
47
|
+
"NUMERIC",
|
|
48
|
+
"SMALLINT",
|
|
49
|
+
"TEXT",
|
|
50
|
+
"TIME",
|
|
51
|
+
"TIMESTAMP",
|
|
52
|
+
"VARCHAR",
|
|
53
|
+
"REAL",
|
|
54
|
+
"Insert",
|
|
55
|
+
"insert",
|
|
56
|
+
"dialect",
|
|
57
|
+
)
|