]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
refactor: update proxied_association to declarative
authorMike Fiedler <miketheman@gmail.com>
Fri, 25 Oct 2024 20:22:48 +0000 (13:22 -0700)
committerMike Fiedler <miketheman@gmail.com>
Mon, 18 Nov 2024 18:45:38 +0000 (13:45 -0500)
Signed-off-by: Mike Fiedler <miketheman@gmail.com>
examples/association/proxied_association.py

index 65dcd6c0b66e9cddb5e9442eaea20e6903fc558a..e3c022aba16151f848d0c680ae68099f9404240d 100644 (file)
@@ -5,64 +5,72 @@ to ``OrderItem`` optional.
 
 """
 
+from __future__ import annotations
+
 from datetime import datetime
 
-from sqlalchemy import Column
 from sqlalchemy import create_engine
-from sqlalchemy import DateTime
-from sqlalchemy import Float
 from sqlalchemy import ForeignKey
-from sqlalchemy import Integer
 from sqlalchemy import String
 from sqlalchemy.ext.associationproxy import association_proxy
-from sqlalchemy.ext.declarative import declarative_base
+from sqlalchemy.ext.associationproxy import AssociationProxy
+from sqlalchemy.orm import DeclarativeBase
+from sqlalchemy.orm import Mapped
+from sqlalchemy.orm import mapped_column
 from sqlalchemy.orm import relationship
 from sqlalchemy.orm import Session
 
 
-Base = declarative_base()
+class Base(DeclarativeBase):
+    pass
 
 
 class Order(Base):
     __tablename__ = "order"
 
-    order_id = Column(Integer, primary_key=True)
-    customer_name = Column(String(30), nullable=False)
-    order_date = Column(DateTime, nullable=False, default=datetime.now())
-    order_items = relationship(
-        "OrderItem", cascade="all, delete-orphan", backref="order"
+    order_id: Mapped[int] = mapped_column(primary_key=True)
+    customer_name: Mapped[str] = mapped_column(String(30))
+    order_date: Mapped[datetime] = mapped_column(default=datetime.now())
+    order_items: Mapped[list[OrderItem]] = relationship(
+        cascade="all, delete-orphan", backref="order"
+    )
+    items: AssociationProxy[list[Item]] = association_proxy(
+        "order_items", "item"
     )
-    items = association_proxy("order_items", "item")
 
-    def __init__(self, customer_name):
+    def __init__(self, customer_name: str) -> None:
         self.customer_name = customer_name
 
 
 class Item(Base):
     __tablename__ = "item"
-    item_id = Column(Integer, primary_key=True)
-    description = Column(String(30), nullable=False)
-    price = Column(Float, nullable=False)
+    item_id: Mapped[int] = mapped_column(primary_key=True)
+    description: Mapped[str] = mapped_column(String(30))
+    price: Mapped[float]
 
-    def __init__(self, description, price):
+    def __init__(self, description: str, price: float) -> None:
         self.description = description
         self.price = price
 
-    def __repr__(self):
-        return "Item(%r, %r)" % (self.description, self.price)
+    def __repr__(self) -> str:
+        return "Item({!r}, {!r})".format(self.description, self.price)
 
 
 class OrderItem(Base):
     __tablename__ = "orderitem"
-    order_id = Column(Integer, ForeignKey("order.order_id"), primary_key=True)
-    item_id = Column(Integer, ForeignKey("item.item_id"), primary_key=True)
-    price = Column(Float, nullable=False)
+    order_id: Mapped[int] = mapped_column(
+        ForeignKey("order.order_id"), primary_key=True
+    )
+    item_id: Mapped[int] = mapped_column(
+        ForeignKey("item.item_id"), primary_key=True
+    )
+    price: Mapped[float]
 
-    def __init__(self, item, price=None):
+    def __init__(self, item: Item, price: float | None = None):
         self.item = item
         self.price = price or item.price
 
-    item = relationship(Item, lazy="joined")
+    item: Mapped[Item] = relationship(lazy="joined")
 
 
 if __name__ == "__main__":