from sqlalchemy import Column, DateTime, Integer, String, ForeignKey, UniqueConstraint from sqlalchemy.dialects.mysql import BIT from sqlalchemy.orm import relationship from database.base import Base class Sport(Base): __tablename__ = "sport" __table_args__ = ( UniqueConstraint("name"), ) id = Column(String, primary_key=True) created_date = Column(DateTime) last_modified_date = Column(DateTime) version = Column(Integer) name = Column(String(255), nullable=False, index=True, unique=True) teams = relationship("Team") positions = relationship("FieldPosition") class Team(Base): __tablename__ = "team" id = Column(String, primary_key=True) created_date = Column(DateTime) last_modified_date = Column(DateTime) version = Column(Integer) name = Column(String(255), nullable=False, index=True, unique=True) short_name = Column(String(255), nullable=False, ) sport_id = Column(String, ForeignKey("sport.id"), nullable=False) sport = relationship("Sport", back_populates="positions") roosters = relationship("Rooster") class FieldPosition(Base): __tablename__ = "field_position" __table_args__ = ( UniqueConstraint("name", "sport_id"), UniqueConstraint("short_name", "sport_id"), ) id = Column(String, primary_key=True) created_date = Column(DateTime) last_modified_date = Column(DateTime) version = Column(Integer) name = Column(String(255), nullable=False, index=True) short_name = Column(String(255), nullable=False) sport_id = Column(String, ForeignKey("sport.id"), nullable=False, index=True) sport = relationship("Sport", back_populates="positions") roosters = relationship("Rooster") class Player(Base): __tablename__ = "player" __table_args__ = ( UniqueConstraint("first_name", "last_name"), ) id = Column(String, primary_key=True) created_date = Column(DateTime) last_modified_date = Column(DateTime) version = Column(Integer) first_name = Column(String(255), nullable=False, index=True) last_name = Column(String(255), nullable=False, index=True) roosters = relationship("Rooster") def get_full_name(self) -> str: return f"{self.last_name}, {self.first_name}" class Rooster(Base): __tablename__ = "rooster" __table_args__ = ( UniqueConstraint("year", "team_id", "player_id", "position_id"), ) id = Column(String, primary_key=True) created_date = Column(DateTime) last_modified_date = Column(DateTime) version = Column(Integer) year = Column(Integer) team_id = Column(String, ForeignKey("team.id"), nullable=False, index=True) team = relationship("Team", back_populates="roosters") player_id = Column(String, ForeignKey("player.id"), nullable=False, index=True) player = relationship("Player", back_populates="roosters") position_id = Column(String, ForeignKey("field_position.id"), nullable=False, index=True) position = relationship("roosters") cards = relationship("Card") class Vendor(Base): __tablename__ = "vendor" id = Column(String, primary_key=True) created_date = Column(DateTime) last_modified_date = Column(DateTime) version = Column(Integer) name = Column(String(255), nullable=False, unique=True, index=True) card_sets = relationship("CardSet") cards = relationship("Card") class CardSet(Base): __tablename__ = "card_set" __table_args__ = ( UniqueConstraint("name", "vendor_id"), ) id = Column(String, primary_key=True) created_date = Column(DateTime) last_modified_date = Column(DateTime) version = Column(Integer) name = Column(String(255), index=True) parallel_set = Column(BIT(1)) insert_set = Column(BIT(1)) vendor_id = Column(String, ForeignKey("vendor.id"), nullable=False, index=True) vendor = relationship("Vendor", back_populates="card_sets") cards = relationship("Card") class Card(Base): __tablename__ = "card" __table_args__ = ( UniqueConstraint("card_number", "year", "vendor_id", "card_set_id"), ) id = Column(String, primary_key=True) created_date = Column(DateTime) last_modified_date = Column(DateTime) version = Column(Integer) card_number = Column(Integer, index=True) year = Column(Integer, index=True) card_set_id = Column(String, ForeignKey("card_set.id"), nullable=False) card_set = relationship("cards") rooster_id = Column(String, ForeignKey("rooster.id"), nullable=False) rooster = relationship("cards") vendor_id = Column(String, ForeignKey("vendor.id"), nullable=False) vendor = relationship("Vendor", back_populates="cards")