]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Place DDLConstraintColumn Role in Mapped
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 28 Jan 2023 19:56:17 +0000 (14:56 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 28 Jan 2023 21:29:05 +0000 (16:29 -0500)
Fixed typing issue where :func:`_orm.mapped_column` objects typed as
:class:`_orm.Mapped` wouldn't be accepted in schema constraints such as
:class:`_schema.ForeignKey`, :class:`_schema.UniqueConstraint` or
:class:`_schema.Index`.

Fixes: #9170
Change-Id: I41c76d224a1fa2377de151d2a713ba3f43bd245c

doc/build/changelog/unreleased_20/9170.rst [new file with mode: 0644]
lib/sqlalchemy/orm/attributes.py
lib/sqlalchemy/orm/base.py
lib/sqlalchemy/orm/properties.py
test/ext/mypy/plain_files/mapped_column.py

diff --git a/doc/build/changelog/unreleased_20/9170.rst b/doc/build/changelog/unreleased_20/9170.rst
new file mode 100644 (file)
index 0000000..f891c2d
--- /dev/null
@@ -0,0 +1,8 @@
+.. change::
+    :tags: bug, typing
+    :tickets: 9170
+
+    Fixed typing issue where :func:`_orm.mapped_column` objects typed as
+    :class:`_orm.Mapped` wouldn't be accepted in schema constraints such as
+    :class:`_schema.ForeignKey`, :class:`_schema.UniqueConstraint` or
+    :class:`_schema.Index`.
index 261a633a34208c45dd3ce89e7db4ebfbe2fe65fb..cdc729f739a6ccb61bb205a68dce0214bee958c8 100644 (file)
@@ -135,7 +135,6 @@ class QueryableAttribute(
     interfaces.PropComparator[_T],
     roles.JoinTargetRole,
     roles.OnClauseRole,
-    roles.DDLConstraintColumnRole,
     sql_base.Immutable,
     cache_key.SlotsMemoizedHasCacheKey,
     util.MemoizedSlots,
index 331464cf808b075a6d37fed946f6d2dcd71b24e8..5b6675365e952869c4b77ec41c1ba27040ca0266 100644 (file)
@@ -31,6 +31,7 @@ from ._typing import insp_is_mapper
 from .. import exc as sa_exc
 from .. import inspection
 from .. import util
+from ..sql import roles
 from ..sql.elements import SQLColumnExpression
 from ..sql.elements import SQLCoreOperations
 from ..util import FastIntFlag
@@ -775,6 +776,7 @@ class Mapped(
     SQLORMExpression[_T],
     ORMDescriptor[_T],
     _MappedAnnotationBase[_T],
+    roles.DDLConstraintColumnRole,
 ):
     """Represent an ORM mapped attribute on a mapped class.
 
index baaa0291b449ce03760334c0ac199c5f73a18d24..9feb72e40f57586e685312dce93317421f0a06fe 100644 (file)
@@ -47,7 +47,6 @@ from .. import util
 from ..sql import coercions
 from ..sql import roles
 from ..sql.base import _NoArg
-from ..sql.roles import DDLConstraintColumnRole
 from ..sql.schema import Column
 from ..sql.schema import SchemaConst
 from ..sql.type_api import TypeEngine
@@ -504,7 +503,6 @@ class MappedSQLExpression(ColumnProperty[_T], _DeclarativeMapped[_T]):
 
 
 class MappedColumn(
-    DDLConstraintColumnRole,
     _IntrospectsAnnotations,
     _MapsColumns[_T],
     _DeclarativeMapped[_T],
index 14f4ad845a82a7ef0fd5a342042bf5dcf20255e4..26f5722a6fc04bb97fb71d58947b238146288315 100644 (file)
@@ -1,7 +1,10 @@
 from typing import Optional
 
+from sqlalchemy import ForeignKey
+from sqlalchemy import Index
 from sqlalchemy import Integer
 from sqlalchemy import String
+from sqlalchemy import UniqueConstraint
 from sqlalchemy.orm import DeclarativeBase
 from sqlalchemy.orm import Mapped
 from sqlalchemy.orm import mapped_column
@@ -44,9 +47,10 @@ class X(Base):
     c: Mapped[str] = mapped_column(nullable=True)
     d: Mapped[str] = mapped_column(nullable=False)
 
-    e: Mapped[Optional[str]] = mapped_column(nullable=True)
+    e: Mapped[Optional[str]] = mapped_column(ForeignKey(c), nullable=True)
 
-    f: Mapped[Optional[str]] = mapped_column(nullable=False)
+    f1 = mapped_column(Integer)
+    f: Mapped[Optional[str]] = mapped_column(ForeignKey(f1), nullable=False)
 
     g: Mapped[str] = mapped_column(String)
     h: Mapped[Optional[str]] = mapped_column(String)
@@ -88,3 +92,5 @@ class X(Base):
         String,
         nullable=False,
     )
+
+    __table_args__ = (UniqueConstraint(a, b, name="uq1"), Index("ix1", c, d))