"""
+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__":