from ..orm.decl_api import DeclarativeAttributeIntercept
from ..orm.state import InstanceState
from ..orm.unitofwork import UOWTransaction
+from ..sql._typing import _TypeEngineArgument
from ..sql.base import SchemaEventTarget
from ..sql.schema import Column
from ..sql.type_api import TypeEngine
event.listen(Mapper, "mapper_configured", listen_for_type)
@classmethod
- def as_mutable(cls, sqltype: TypeEngine[_T]) -> TypeEngine[_T]:
+ def as_mutable(cls, sqltype: _TypeEngineArgument[_T]) -> TypeEngine[_T]:
"""Associate a SQL type with this mutable Python type.
This establishes listeners that will detect ORM mappings against
@util.preload_module("sqlalchemy.sql.selectable")
def columns(
- self, *cols: _ColumnExpressionArgument[Any], **types: TypeEngine[Any]
+ self,
+ *cols: _ColumnExpressionArgument[Any],
+ **types: _TypeEngineArgument[Any],
) -> TextualSelect:
r"""Turn this :class:`_expression.TextClause` object into a
:class:`_expression.TextualSelect`
def adapt_type(
- typeobj: TypeEngine[Any],
+ typeobj: _TypeEngineArgument[Any],
colspecs: Mapping[Type[Any], Type[TypeEngine[Any]]],
) -> TypeEngine[Any]:
- if isinstance(typeobj, type):
- typeobj = typeobj()
+ typeobj = to_instance(typeobj)
for t in typeobj.__class__.__mro__[0:-1]:
try:
impltype = colspecs[t]
--- /dev/null
+from typing import Any
+
+from sqlalchemy import JSON
+from sqlalchemy import Select
+from sqlalchemy.ext.compiler import compiles
+from sqlalchemy.ext.mutable import MutableDict
+from sqlalchemy.ext.mutable import MutableList
+from sqlalchemy.sql.compiler import SQLCompiler
+
+
+@compiles(Select[Any], "my_cool_driver")
+def go(sel: Select[Any], compiler: SQLCompiler, **kw: Any) -> str:
+ return "select 42"
+
+
+MutableList.as_mutable(JSON)
+MutableDict.as_mutable(JSON())