diff --git a/CHANGELOG.md b/CHANGELOG.md index 82fea55..2a04bee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,3 +11,4 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - CI/CD action with Python testing, linting, and import checking - Database schemas for data provided by the NFL +- Support for database migrations diff --git a/nfl_bdb/database/migrations/versions/ea566b5493e5_unique_constraints_and_indexes.py b/nfl_bdb/database/migrations/versions/ea566b5493e5_unique_constraints_and_indexes.py new file mode 100644 index 0000000..018141c --- /dev/null +++ b/nfl_bdb/database/migrations/versions/ea566b5493e5_unique_constraints_and_indexes.py @@ -0,0 +1,36 @@ +"""Unique constraints and indexes + +Revision ID: ea566b5493e5 +Revises: f3897e90455a +Create Date: 2023-12-18 16:00:07.059375 + +""" +from typing import Sequence, Union + +from alembic import op + +# revision identifiers, used by Alembic. +revision: str = "ea566b5493e5" +down_revision: Union[str, None] = "f3897e90455a" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_unique_constraint("plays_UQ1", "plays", ["game_id", "ingame_play_id"]) + op.create_unique_constraint("tackles_UQ1", "tackles", ["play_id", "player_id"]) + op.create_index(op.f("ix_tracking_play_id"), "tracking", ["play_id"], unique=False) + op.create_unique_constraint( + "tracking_UQ1", "tracking", ["play_id", "player_id", "frame"] + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint("tracking_UQ1", "tracking", type_="unique") + op.drop_index(op.f("ix_tracking_play_id"), table_name="tracking") + op.drop_constraint("tackles_UQ1", "tackles", type_="unique") + op.drop_constraint("plays_UQ1", "plays", type_="unique") + # ### end Alembic commands ### diff --git a/nfl_bdb/database/models/play.py b/nfl_bdb/database/models/play.py index 8100da6..5bc7c7a 100644 --- a/nfl_bdb/database/models/play.py +++ b/nfl_bdb/database/models/play.py @@ -1,6 +1,6 @@ from typing import TYPE_CHECKING, Optional -from sqlalchemy import ForeignKey +from sqlalchemy import ForeignKey, UniqueConstraint from sqlalchemy.orm import Mapped, mapped_column, relationship from nfl_bdb.database.models import Base @@ -81,3 +81,5 @@ class Play(Base): offensive_team: Mapped[Team] = relationship(Team, foreign_keys=[offensive_team_id]) los_team: Mapped[Team] = relationship(Team, foreign_keys=[los_team_id]) + + __table_args__ = (UniqueConstraint("game_id", "ingame_play_id", name="plays_UQ1"),) diff --git a/nfl_bdb/database/models/tackle.py b/nfl_bdb/database/models/tackle.py index 8693864..a89ba53 100644 --- a/nfl_bdb/database/models/tackle.py +++ b/nfl_bdb/database/models/tackle.py @@ -1,6 +1,6 @@ from typing import TYPE_CHECKING -from sqlalchemy import ForeignKey +from sqlalchemy import ForeignKey, UniqueConstraint from sqlalchemy.orm import Mapped, mapped_column, relationship from nfl_bdb.database.models import Base @@ -24,3 +24,5 @@ class Tackle(Base): play: Mapped["Play"] = relationship() player: Mapped["Player"] = relationship() + + __table_args__ = (UniqueConstraint("play_id", "player_id", name="tackles_UQ1"),) diff --git a/nfl_bdb/database/models/tracking.py b/nfl_bdb/database/models/tracking.py index f169ca2..b039d6c 100644 --- a/nfl_bdb/database/models/tracking.py +++ b/nfl_bdb/database/models/tracking.py @@ -1,7 +1,7 @@ import datetime from typing import Optional -from sqlalchemy import ForeignKey +from sqlalchemy import ForeignKey, UniqueConstraint from sqlalchemy.orm import Mapped, mapped_column, relationship from nfl_bdb.database.models import Base @@ -16,7 +16,7 @@ class TrackingPoint(Base): player_id: Mapped[Optional[int]] = mapped_column( ForeignKey("players.player_id"), nullable=True ) - play_id: Mapped[int] = mapped_column(ForeignKey("plays.play_id")) + play_id: Mapped[int] = mapped_column(ForeignKey("plays.play_id"), index=True) frame: Mapped[int] = mapped_column() x: Mapped[float] = mapped_column() @@ -36,3 +36,7 @@ class TrackingPoint(Base): player: Mapped[Optional[Player]] = relationship() play: Mapped[Play] = relationship() + + __table_args__ = ( + UniqueConstraint("play_id", "player_id", "frame", name="tracking_UQ1"), + )