from ..util.typing import Literal
if typing.TYPE_CHECKING:
- from . import sqltypes
from ._typing import _ColumnExpressionArgument
+ from ._typing import _ColumnExpressionOrLiteralArgument
from ._typing import _TypeEngineArgument
from .elements import BinaryExpression
from .functions import FunctionElement
def between(
- expr: _ColumnExpressionArgument[_T],
+ expr: _ColumnExpressionOrLiteralArgument[_T],
lower_bound: Any,
upper_bound: Any,
symmetric: bool = False,
def cast(
- expression: _ColumnExpressionArgument[Any],
+ expression: _ColumnExpressionOrLiteralArgument[Any],
type_: _TypeEngineArgument[_T],
) -> Cast[_T]:
r"""Produce a ``CAST`` expression.
def type_coerce(
- expression: _ColumnExpressionArgument[Any],
+ expression: _ColumnExpressionOrLiteralArgument[Any],
type_: _TypeEngineArgument[_T],
) -> TypeCoerce[_T]:
r"""Associate a SQL expression with a particular type, without rendering
"""
+_ColumnExpressionOrLiteralArgument = Union[Any, _ColumnExpressionArgument[_T]]
+
+
_InfoType = Dict[Any, Any]
"""the .info dictionary accepted and used throughout Core /ORM"""
--- /dev/null
+from sqlalchemy import cast
+from sqlalchemy import Column
+from sqlalchemy import func
+from sqlalchemy import Integer
+from sqlalchemy import or_
+from sqlalchemy import select
+from sqlalchemy import Text
+from sqlalchemy.dialects.postgresql import ARRAY
+from sqlalchemy.dialects.postgresql import array
+from sqlalchemy.dialects.postgresql import JSONB
+from sqlalchemy.orm import DeclarativeBase
+
+
+class Base(DeclarativeBase):
+ pass
+
+
+class Test(Base):
+ __tablename__ = "test_table_json"
+
+ id = Column(Integer, primary_key=True)
+ data = Column(JSONB)
+
+
+elem = func.jsonb_array_elements(Test.data, type_=JSONB).column_valued("elem")
+
+stmt = select(Test).where(
+ or_(
+ cast("example code", ARRAY(Text)).contained_by(
+ array([select(elem["code"].astext).scalar_subquery()])
+ ),
+ cast("stefan", ARRAY(Text)).contained_by(
+ array([select(elem["code"]["new_value"].astext).scalar_subquery()])
+ ),
+ )
+)
+print(stmt)