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,313 @@
|
|
|
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 Optional
|
|
12
|
+
from typing import overload
|
|
13
|
+
from typing import Type
|
|
14
|
+
from typing import TYPE_CHECKING
|
|
15
|
+
from uuid import UUID as _python_UUID
|
|
16
|
+
|
|
17
|
+
from ...sql import sqltypes
|
|
18
|
+
from ...sql import type_api
|
|
19
|
+
from ...util.typing import Literal
|
|
20
|
+
|
|
21
|
+
if TYPE_CHECKING:
|
|
22
|
+
from ...engine.interfaces import Dialect
|
|
23
|
+
from ...sql.operators import OperatorType
|
|
24
|
+
from ...sql.type_api import _LiteralProcessorType
|
|
25
|
+
from ...sql.type_api import TypeEngine
|
|
26
|
+
|
|
27
|
+
_DECIMAL_TYPES = (1231, 1700)
|
|
28
|
+
_FLOAT_TYPES = (700, 701, 1021, 1022)
|
|
29
|
+
_INT_TYPES = (20, 21, 23, 26, 1005, 1007, 1016)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class PGUuid(sqltypes.UUID[sqltypes._UUID_RETURN]):
|
|
33
|
+
render_bind_cast = True
|
|
34
|
+
render_literal_cast = True
|
|
35
|
+
|
|
36
|
+
if TYPE_CHECKING:
|
|
37
|
+
|
|
38
|
+
@overload
|
|
39
|
+
def __init__(
|
|
40
|
+
self: PGUuid[_python_UUID], as_uuid: Literal[True] = ...
|
|
41
|
+
) -> None: ...
|
|
42
|
+
|
|
43
|
+
@overload
|
|
44
|
+
def __init__(
|
|
45
|
+
self: PGUuid[str], as_uuid: Literal[False] = ...
|
|
46
|
+
) -> None: ...
|
|
47
|
+
|
|
48
|
+
def __init__(self, as_uuid: bool = True) -> None: ...
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class BYTEA(sqltypes.LargeBinary):
|
|
52
|
+
__visit_name__ = "BYTEA"
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class _NetworkAddressTypeMixin:
|
|
56
|
+
|
|
57
|
+
def coerce_compared_value(
|
|
58
|
+
self, op: Optional[OperatorType], value: Any
|
|
59
|
+
) -> TypeEngine[Any]:
|
|
60
|
+
if TYPE_CHECKING:
|
|
61
|
+
assert isinstance(self, TypeEngine)
|
|
62
|
+
return self
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class INET(_NetworkAddressTypeMixin, sqltypes.TypeEngine[str]):
|
|
66
|
+
__visit_name__ = "INET"
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
PGInet = INET
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class CIDR(_NetworkAddressTypeMixin, sqltypes.TypeEngine[str]):
|
|
73
|
+
__visit_name__ = "CIDR"
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
PGCidr = CIDR
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
class MACADDR(_NetworkAddressTypeMixin, sqltypes.TypeEngine[str]):
|
|
80
|
+
__visit_name__ = "MACADDR"
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
PGMacAddr = MACADDR
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
class MACADDR8(_NetworkAddressTypeMixin, sqltypes.TypeEngine[str]):
|
|
87
|
+
__visit_name__ = "MACADDR8"
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
PGMacAddr8 = MACADDR8
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
class MONEY(sqltypes.TypeEngine[str]):
|
|
94
|
+
r"""Provide the PostgreSQL MONEY type.
|
|
95
|
+
|
|
96
|
+
Depending on driver, result rows using this type may return a
|
|
97
|
+
string value which includes currency symbols.
|
|
98
|
+
|
|
99
|
+
For this reason, it may be preferable to provide conversion to a
|
|
100
|
+
numerically-based currency datatype using :class:`_types.TypeDecorator`::
|
|
101
|
+
|
|
102
|
+
import re
|
|
103
|
+
import decimal
|
|
104
|
+
from sqlalchemy import Dialect
|
|
105
|
+
from sqlalchemy import TypeDecorator
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
class NumericMoney(TypeDecorator):
|
|
109
|
+
impl = MONEY
|
|
110
|
+
|
|
111
|
+
def process_result_value(self, value: Any, dialect: Dialect) -> None:
|
|
112
|
+
if value is not None:
|
|
113
|
+
# adjust this for the currency and numeric
|
|
114
|
+
m = re.match(r"\$([\d.]+)", value)
|
|
115
|
+
if m:
|
|
116
|
+
value = decimal.Decimal(m.group(1))
|
|
117
|
+
return value
|
|
118
|
+
|
|
119
|
+
Alternatively, the conversion may be applied as a CAST using
|
|
120
|
+
the :meth:`_types.TypeDecorator.column_expression` method as follows::
|
|
121
|
+
|
|
122
|
+
import decimal
|
|
123
|
+
from sqlalchemy import cast
|
|
124
|
+
from sqlalchemy import TypeDecorator
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
class NumericMoney(TypeDecorator):
|
|
128
|
+
impl = MONEY
|
|
129
|
+
|
|
130
|
+
def column_expression(self, column: Any):
|
|
131
|
+
return cast(column, Numeric())
|
|
132
|
+
|
|
133
|
+
.. versionadded:: 1.2
|
|
134
|
+
|
|
135
|
+
""" # noqa: E501
|
|
136
|
+
|
|
137
|
+
__visit_name__ = "MONEY"
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
class OID(sqltypes.TypeEngine[int]):
|
|
141
|
+
"""Provide the PostgreSQL OID type."""
|
|
142
|
+
|
|
143
|
+
__visit_name__ = "OID"
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
class REGCONFIG(sqltypes.TypeEngine[str]):
|
|
147
|
+
"""Provide the PostgreSQL REGCONFIG type.
|
|
148
|
+
|
|
149
|
+
.. versionadded:: 2.0.0rc1
|
|
150
|
+
|
|
151
|
+
"""
|
|
152
|
+
|
|
153
|
+
__visit_name__ = "REGCONFIG"
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
class TSQUERY(sqltypes.TypeEngine[str]):
|
|
157
|
+
"""Provide the PostgreSQL TSQUERY type.
|
|
158
|
+
|
|
159
|
+
.. versionadded:: 2.0.0rc1
|
|
160
|
+
|
|
161
|
+
"""
|
|
162
|
+
|
|
163
|
+
__visit_name__ = "TSQUERY"
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
class REGCLASS(sqltypes.TypeEngine[str]):
|
|
167
|
+
"""Provide the PostgreSQL REGCLASS type.
|
|
168
|
+
|
|
169
|
+
.. versionadded:: 1.2.7
|
|
170
|
+
|
|
171
|
+
"""
|
|
172
|
+
|
|
173
|
+
__visit_name__ = "REGCLASS"
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
class TIMESTAMP(sqltypes.TIMESTAMP):
|
|
177
|
+
"""Provide the PostgreSQL TIMESTAMP type."""
|
|
178
|
+
|
|
179
|
+
__visit_name__ = "TIMESTAMP"
|
|
180
|
+
|
|
181
|
+
def __init__(
|
|
182
|
+
self, timezone: bool = False, precision: Optional[int] = None
|
|
183
|
+
) -> None:
|
|
184
|
+
"""Construct a TIMESTAMP.
|
|
185
|
+
|
|
186
|
+
:param timezone: boolean value if timezone present, default False
|
|
187
|
+
:param precision: optional integer precision value
|
|
188
|
+
|
|
189
|
+
.. versionadded:: 1.4
|
|
190
|
+
|
|
191
|
+
"""
|
|
192
|
+
super().__init__(timezone=timezone)
|
|
193
|
+
self.precision = precision
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
class TIME(sqltypes.TIME):
|
|
197
|
+
"""PostgreSQL TIME type."""
|
|
198
|
+
|
|
199
|
+
__visit_name__ = "TIME"
|
|
200
|
+
|
|
201
|
+
def __init__(
|
|
202
|
+
self, timezone: bool = False, precision: Optional[int] = None
|
|
203
|
+
) -> None:
|
|
204
|
+
"""Construct a TIME.
|
|
205
|
+
|
|
206
|
+
:param timezone: boolean value if timezone present, default False
|
|
207
|
+
:param precision: optional integer precision value
|
|
208
|
+
|
|
209
|
+
.. versionadded:: 1.4
|
|
210
|
+
|
|
211
|
+
"""
|
|
212
|
+
super().__init__(timezone=timezone)
|
|
213
|
+
self.precision = precision
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
class INTERVAL(type_api.NativeForEmulated, sqltypes._AbstractInterval):
|
|
217
|
+
"""PostgreSQL INTERVAL type."""
|
|
218
|
+
|
|
219
|
+
__visit_name__ = "INTERVAL"
|
|
220
|
+
native = True
|
|
221
|
+
|
|
222
|
+
def __init__(
|
|
223
|
+
self, precision: Optional[int] = None, fields: Optional[str] = None
|
|
224
|
+
) -> None:
|
|
225
|
+
"""Construct an INTERVAL.
|
|
226
|
+
|
|
227
|
+
:param precision: optional integer precision value
|
|
228
|
+
:param fields: string fields specifier. allows storage of fields
|
|
229
|
+
to be limited, such as ``"YEAR"``, ``"MONTH"``, ``"DAY TO HOUR"``,
|
|
230
|
+
etc.
|
|
231
|
+
|
|
232
|
+
.. versionadded:: 1.2
|
|
233
|
+
|
|
234
|
+
"""
|
|
235
|
+
self.precision = precision
|
|
236
|
+
self.fields = fields
|
|
237
|
+
|
|
238
|
+
@classmethod
|
|
239
|
+
def adapt_emulated_to_native(
|
|
240
|
+
cls, interval: sqltypes.Interval, **kw: Any # type: ignore[override]
|
|
241
|
+
) -> INTERVAL:
|
|
242
|
+
return INTERVAL(precision=interval.second_precision)
|
|
243
|
+
|
|
244
|
+
@property
|
|
245
|
+
def _type_affinity(self) -> Type[sqltypes.Interval]:
|
|
246
|
+
return sqltypes.Interval
|
|
247
|
+
|
|
248
|
+
def as_generic(self, allow_nulltype: bool = False) -> sqltypes.Interval:
|
|
249
|
+
return sqltypes.Interval(native=True, second_precision=self.precision)
|
|
250
|
+
|
|
251
|
+
@property
|
|
252
|
+
def python_type(self) -> Type[dt.timedelta]:
|
|
253
|
+
return dt.timedelta
|
|
254
|
+
|
|
255
|
+
def literal_processor(
|
|
256
|
+
self, dialect: Dialect
|
|
257
|
+
) -> Optional[_LiteralProcessorType[dt.timedelta]]:
|
|
258
|
+
def process(value: dt.timedelta) -> str:
|
|
259
|
+
return f"make_interval(secs=>{value.total_seconds()})"
|
|
260
|
+
|
|
261
|
+
return process
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
PGInterval = INTERVAL
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
class BIT(sqltypes.TypeEngine[int]):
|
|
268
|
+
__visit_name__ = "BIT"
|
|
269
|
+
|
|
270
|
+
def __init__(
|
|
271
|
+
self, length: Optional[int] = None, varying: bool = False
|
|
272
|
+
) -> None:
|
|
273
|
+
if varying:
|
|
274
|
+
# BIT VARYING can be unlimited-length, so no default
|
|
275
|
+
self.length = length
|
|
276
|
+
else:
|
|
277
|
+
# BIT without VARYING defaults to length 1
|
|
278
|
+
self.length = length or 1
|
|
279
|
+
self.varying = varying
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
PGBit = BIT
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
class TSVECTOR(sqltypes.TypeEngine[str]):
|
|
286
|
+
"""The :class:`_postgresql.TSVECTOR` type implements the PostgreSQL
|
|
287
|
+
text search type TSVECTOR.
|
|
288
|
+
|
|
289
|
+
It can be used to do full text queries on natural language
|
|
290
|
+
documents.
|
|
291
|
+
|
|
292
|
+
.. seealso::
|
|
293
|
+
|
|
294
|
+
:ref:`postgresql_match`
|
|
295
|
+
|
|
296
|
+
"""
|
|
297
|
+
|
|
298
|
+
__visit_name__ = "TSVECTOR"
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
class CITEXT(sqltypes.TEXT):
|
|
302
|
+
"""Provide the PostgreSQL CITEXT type.
|
|
303
|
+
|
|
304
|
+
.. versionadded:: 2.0.7
|
|
305
|
+
|
|
306
|
+
"""
|
|
307
|
+
|
|
308
|
+
__visit_name__ = "CITEXT"
|
|
309
|
+
|
|
310
|
+
def coerce_compared_value(
|
|
311
|
+
self, op: Optional[OperatorType], value: Any
|
|
312
|
+
) -> TypeEngine[Any]:
|
|
313
|
+
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
|
+
)
|