import re
from typing import Any
+from typing import Optional
from typing import TypeVar
from ... import types as sqltypes
from ... import util
from ...sql import expression
from ...sql import operators
+from ...sql._typing import _TypeEngineArgument
_T = TypeVar("_T", bound=Any)
comparator_factory = Comparator
def __init__(
- self, item_type, as_tuple=False, dimensions=None, zero_indexes=False
+ self,
+ item_type: _TypeEngineArgument[Any],
+ as_tuple: bool = False,
+ dimensions: Optional[int] = None,
+ zero_indexes: bool = False,
):
"""Construct an ARRAY.
# the MIT License: https://www.opensource.org/licenses/mit-license.php
# mypy: ignore-errors
-
r"""
.. dialect:: postgresql
:name: PostgreSQL
""" # noqa: E501
+from __future__ import annotations
+
from collections import defaultdict
import datetime as dt
import re
+from typing import Any
+from typing import overload
+from typing import TypeVar
from uuid import UUID as _python_UUID
from . import array as _array
from ...types import SMALLINT
from ...types import TEXT
from ...types import VARCHAR
+from ...util.typing import Literal
IDX_USING = re.compile(r"^(?:btree|hash|gist|gin|[\w_]+)$", re.I)
_INT_TYPES = (20, 21, 23, 26, 1005, 1007, 1016)
-class BYTEA(sqltypes.LargeBinary):
+class BYTEA(sqltypes.LargeBinary[bytes]):
__visit_name__ = "BYTEA"
-class INET(sqltypes.TypeEngine):
+class INET(sqltypes.TypeEngine[str]):
__visit_name__ = "INET"
PGInet = INET
-class CIDR(sqltypes.TypeEngine):
+class CIDR(sqltypes.TypeEngine[str]):
__visit_name__ = "CIDR"
PGCidr = CIDR
-class MACADDR(sqltypes.TypeEngine):
+class MACADDR(sqltypes.TypeEngine[str]):
__visit_name__ = "MACADDR"
PGMacAddr = MACADDR
-class MONEY(sqltypes.TypeEngine):
+class MONEY(sqltypes.TypeEngine[str]):
r"""Provide the PostgreSQL MONEY type.
__visit_name__ = "MONEY"
-class OID(sqltypes.TypeEngine):
+class OID(sqltypes.TypeEngine[int]):
"""Provide the PostgreSQL OID type.
__visit_name__ = "OID"
-class REGCLASS(sqltypes.TypeEngine):
+class REGCLASS(sqltypes.TypeEngine[str]):
"""Provide the PostgreSQL REGCLASS type.
PGInterval = INTERVAL
-class BIT(sqltypes.TypeEngine):
+class BIT(sqltypes.TypeEngine[int]):
__visit_name__ = "BIT"
def __init__(self, length=None, varying=False):
PGBit = BIT
+_UUID_RETURN = TypeVar("_UUID_RETURN", str, _python_UUID)
+
-class UUID(sqltypes.TypeEngine):
+class UUID(sqltypes.TypeEngine[_UUID_RETURN]):
"""PostgreSQL UUID type.
__visit_name__ = "UUID"
- def __init__(self, as_uuid=True):
+ @overload
+ def __init__(self: "UUID[_python_UUID]", as_uuid: Literal[True] = ...):
+ ...
+
+ @overload
+ def __init__(self: "UUID[str]", as_uuid: Literal[False] = ...):
+ ...
+
+ def __init__(self, as_uuid: bool = True):
"""Construct a UUID type.
PGUuid = UUID
-class TSVECTOR(sqltypes.TypeEngine):
+class TSVECTOR(sqltypes.TypeEngine[Any]):
"""The :class:`_postgresql.TSVECTOR` type implements the PostgreSQL
text search type TSVECTOR.
from .type_api import Emulated
from .type_api import NativeForEmulated # noqa
from .type_api import to_instance
-from .type_api import TypeDecorator
-from .type_api import TypeEngine
+from .type_api import TypeDecorator as TypeDecorator
+from .type_api import TypeEngine as TypeEngine
from .type_api import TypeEngineMixin
from .type_api import Variant # noqa
from .visitors import InternalTraversal
+from typing import Any
+from typing import Dict
+from uuid import UUID as _py_uuid
+
from sqlalchemy import cast
from sqlalchemy import Column
from sqlalchemy import func
from sqlalchemy.dialects.postgresql import ARRAY
from sqlalchemy.dialects.postgresql import array
from sqlalchemy.dialects.postgresql import JSONB
+from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.orm import DeclarativeBase
+from sqlalchemy.orm import Mapped
+from sqlalchemy.orm import mapped_column
+
+
+# test #6402
+
+c1 = Column(UUID())
+
+# EXPECTED_TYPE: Column[UUID]
+reveal_type(c1)
+
+c2 = Column(UUID(as_uuid=False))
+
+# EXPECTED_TYPE: Column[str]
+reveal_type(c2)
class Base(DeclarativeBase):
class Test(Base):
__tablename__ = "test_table_json"
- id = Column(Integer, primary_key=True)
- data = Column(JSONB)
+ id = mapped_column(Integer, primary_key=True)
+ data: Mapped[Dict[str, Any]] = mapped_column(JSONB)
+
+ ident: Mapped[_py_uuid] = mapped_column(UUID())
+
+ ident_str: Mapped[str] = mapped_column(UUID(as_uuid=False))
elem = func.jsonb_array_elements(Test.data, type_=JSONB).column_valued("elem")
)
)
print(stmt)
+
+
+t1 = Test()
+
+# EXPECTED_RE_TYPE: .*[dD]ict\[.*str, Any\]
+reveal_type(t1.data)
+
+# EXPECTED_TYPE: UUID
+reveal_type(t1.ident)