The setup for each of the following sections is as follows::
from __future__ import annotations
+ from typing import List
from sqlalchemy import ForeignKey
from sqlalchemy import Integer
__tablename__ = "parent_table"
id: Mapped[int] = mapped_column(primary_key=True)
- children: Mapped[list["Child"]] = relationship(back_populates="parent")
+ children: Mapped[List["Child"]] = relationship(back_populates="parent")
class Child(Base):
__tablename__ = "parent_table"
id: Mapped[int] = mapped_column(primary_key=True)
- children: Mapped[list["Child"]] = relationship()
+ children: Mapped[List["Child"]] = relationship()
class Child(Base):
__tablename__ = "parent_table"
id: Mapped[int] = mapped_column(primary_key=True)
- children: Mapped[list["Child"]] = relationship(back_populates="parent")
+ children: Mapped[List["Child"]] = relationship(back_populates="parent")
class Child(Base):
__tablename__ = "child_table"
id: Mapped[int] = mapped_column(primary_key=True)
- parents: Mapped[list["Parent"]] = relationship(back_populates="child")
+ parents: Mapped[List["Parent"]] = relationship(back_populates="child")
.. _relationship_patterns_nullable_m2o:
__tablename__ = "child_table"
id: Mapped[int] = mapped_column(primary_key=True)
- parents: Mapped[list["Parent"]] = relationship(back_populates="child")
+ parents: Mapped[List["Parent"]] = relationship(back_populates="child")
Above, the column for ``Parent.child_id`` will be created in DDL to allow
``NULL`` values. When using :func:`_orm.mapped_column` with explicit typing
__tablename__ = "child_table"
id: Mapped[int] = mapped_column(primary_key=True)
- parents: Mapped[list[Parent]] = relationship(back_populates="child")
+ parents: Mapped[List[Parent]] = relationship(back_populates="child")
.. _relationships_one_to_one:
__tablename__ = "left_table"
id: Mapped[int] = mapped_column(primary_key=True)
- children: Mapped[list[Child]] = relationship(secondary=association_table)
+ children: Mapped[List[Child]] = relationship(secondary=association_table)
class Child(Base):
__tablename__ = "left_table"
id: Mapped[int] = mapped_column(primary_key=True)
- children: Mapped[list[Child]] = relationship(
+ children: Mapped[List[Child]] = relationship(
secondary=association_table, back_populates="parents"
)
__tablename__ = "right_table"
id: Mapped[int] = mapped_column(primary_key=True)
- parents: Mapped[list[Parent]] = relationship(
+ parents: Mapped[List[Parent]] = relationship(
secondary=association_table, back_populates="children"
)
class Parent(Base):
__tablename__ = "left_table"
id: Mapped[int] = mapped_column(primary_key=True)
- children: Mapped[list["Association"]] = relationship()
+ children: Mapped[List["Association"]] = relationship()
class Child(Base):
class Parent(Base):
__tablename__ = "left_table"
id: Mapped[int] = mapped_column(primary_key=True)
- children: Mapped[list["Association"]] = relationship(back_populates="parent")
+ children: Mapped[List["Association"]] = relationship(back_populates="parent")
class Child(Base):
__tablename__ = "right_table"
id: Mapped[int] = mapped_column(primary_key=True)
- parents: Mapped[list["Association"]] = relationship(back_populates="child")
+ parents: Mapped[List["Association"]] = relationship(back_populates="child")
Working with the association pattern in its direct form requires that child
objects are associated with an association instance before being appended to
id: Mapped[int] = mapped_column(primary_key=True)
# many-to-many relationship to Child, bypassing the `Association` class
- children: Mapped[list["Child"]] = relationship(
+ children: Mapped[List["Child"]] = relationship(
secondary="association_table", back_populates="parents"
)
# association between Parent -> Association -> Child
- child_associations: Mapped[list["Association"]] = relationship(
+ child_associations: Mapped[List["Association"]] = relationship(
back_populates="parent"
)
id: Mapped[int] = mapped_column(primary_key=True)
# many-to-many relationship to Parent, bypassing the `Association` class
- parents: Mapped[list["Parent"]] = relationship(
+ parents: Mapped[List["Parent"]] = relationship(
secondary="association_table", back_populates="children"
)
# association between Child -> Association -> Parent
- parent_associations: Mapped[list["Association"]] = relationship(
+ parent_associations: Mapped[List["Association"]] = relationship(
back_populates="child"
)
id: Mapped[int] = mapped_column(primary_key=True)
# many-to-many relationship to Child, bypassing the `Association` class
- children: Mapped[list["Child"]] = relationship(
+ children: Mapped[List["Child"]] = relationship(
secondary="association_table", back_populates="parents", viewonly=True
)
# association between Parent -> Association -> Child
- child_associations: Mapped[list["Association"]] = relationship(
+ child_associations: Mapped[List["Association"]] = relationship(
back_populates="parent"
)
id: Mapped[int] = mapped_column(primary_key=True)
# many-to-many relationship to Parent, bypassing the `Association` class
- parents: Mapped[list["Parent"]] = relationship(
+ parents: Mapped[List["Parent"]] = relationship(
secondary="association_table", back_populates="children", viewonly=True
)
# association between Child -> Association -> Parent
- parent_associations: Mapped[list["Association"]] = relationship(
+ parent_associations: Mapped[List["Association"]] = relationship(
back_populates="child"
)
class Parent(Base):
# ...
- children: Mapped[list["Child"]] = relationship(back_populates="parent")
+ children: Mapped[List["Child"]] = relationship(back_populates="parent")
class Child(Base):
class Parent(Base):
# ...
- children: Mapped[list["Child"]] = relationship(
+ children: Mapped[List["Child"]] = relationship(
order_by="desc(Child.email_address)",
primaryjoin="Parent.id == Child.parent_id",
)
class Parent(Base):
# ...
- children: Mapped[list["myapp.mymodel.Child"]] = relationship(
+ children: Mapped[List["myapp.mymodel.Child"]] = relationship(
order_by="desc(myapp.mymodel.Child.email_address)",
primaryjoin="myapp.mymodel.Parent.id == myapp.mymodel.Child.parent_id",
)
class Parent(Base):
# ...
- children: Mapped[list["Child"]] = relationship(
+ children: Mapped[List["Child"]] = relationship(
"myapp.mymodel.Child",
order_by="desc(myapp.mymodel.Child.email_address)",
primaryjoin="myapp.mymodel.Parent.id == myapp.mymodel.Child.parent_id",
class Parent(Base):
# ...
- children: Mapped[list["Child"]] = relationship(
+ children: Mapped[List["Child"]] = relationship(
"model1.Child",
order_by="desc(mymodel1.Child.email_address)",
primaryjoin="Parent.id == model1.Child.parent_id",
class Parent(Base):
# ...
- children: Mapped[list["Child"]] = relationship(
+ children: Mapped[List["Child"]] = relationship(
_resolve_child_model(),
order_by=lambda: desc(_resolve_child_model().email_address),
primaryjoin=lambda: Parent.id == _resolve_child_model().parent_id,
__tablename__ = "left_table"
id: Mapped[int] = mapped_column(primary_key=True)
- children: Mapped[list["Child"]] = relationship(
+ children: Mapped[List["Child"]] = relationship(
"Child", secondary=lambda: association_table
)
__tablename__ = "left_table"
id: Mapped[int] = mapped_column(primary_key=True)
- children: Mapped[list["Child"]] = relationship(secondary="association_table")
+ children: Mapped[List["Child"]] = relationship(secondary="association_table")
.. warning:: When passed as a string,
:paramref:`_orm.relationship.secondary` argument is interpreted using Python's
__tablename__ = "user"
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column(String(64))
- kw: Mapped[list[Keyword]] = relationship(secondary=lambda: user_keyword_table)
+ kw: Mapped[List[Keyword]] = relationship(secondary=lambda: user_keyword_table)
def __init__(self, name: str):
self.name = name
# proxy the 'keyword' attribute from the 'kw' relationship
- keywords: AssociationProxy[list[str]] = association_proxy("kw", "keyword")
+ keywords: AssociationProxy[List[str]] = association_proxy("kw", "keyword")
class Keyword(Base):
...
# use Keyword(keyword=kw) on append() events
- keywords: AssociationProxy[list[str]] = association_proxy(
+ keywords: AssociationProxy[List[str]] = association_proxy(
"kw", "keyword", creator=lambda kw: Keyword(keyword=kw)
)
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column(String(64))
- user_keyword_associations: Mapped[list[UserKeywordAssociation]] = relationship(
+ user_keyword_associations: Mapped[List[UserKeywordAssociation]] = relationship(
back_populates="user",
cascade="all, delete-orphan",
)
# association proxy of "user_keyword_associations" collection
# to "keyword" attribute
- keywords: AssociationProxy[list[Keyword]] = association_proxy(
+ keywords: AssociationProxy[List[Keyword]] = association_proxy(
"user_keyword_associations",
"keyword",
creator=lambda keyword: UserKeywordAssociation(keyword=Keyword(keyword)),
)
# column-targeted association proxy
- special_keys: AssociationProxy[list[str]] = association_proxy(
+ special_keys: AssociationProxy[List[str]] = association_proxy(
"user_keyword_associations", "special_key"
)