1+ """Add workout models for fitness tracking
2+
3+ Revision ID: 20250520_workout
4+ Revises: 20250515_social
5+ Create Date: 2025-05-20 10:38:00.000000
6+
7+ """
8+ from alembic import op
9+ import sqlalchemy as sa
10+ import sqlmodel
11+ from sqlalchemy .dialects import postgresql
12+
13+ # revision identifiers, used by Alembic.
14+ revision = '20250520_workout'
15+ down_revision = '20250515_social' # Points to the previous migration
16+ branch_labels = None
17+ depends_on = None
18+
19+
20+ def upgrade ():
21+ # Create Workout table
22+ op .create_table (
23+ 'workout' ,
24+ sa .Column ('id' , postgresql .UUID (), nullable = False ),
25+ sa .Column ('user_id' , postgresql .UUID (), nullable = False ),
26+ sa .Column ('name' , sa .String (), nullable = False ),
27+ sa .Column ('description' , sa .String (), nullable = True ),
28+ sa .Column ('scheduled_date' , sa .DateTime (), nullable = True ),
29+ sa .Column ('completed_date' , sa .DateTime (), nullable = True ),
30+ sa .Column ('duration_minutes' , sa .Integer (), nullable = True ),
31+ sa .Column ('is_completed' , sa .Boolean (), nullable = False ),
32+ sa .Column ('created_at' , sa .DateTime (), nullable = False ),
33+ sa .Column ('updated_at' , sa .DateTime (), nullable = True ),
34+ sa .ForeignKeyConstraint (['user_id' ], ['user.id' ], ondelete = 'CASCADE' ),
35+ sa .PrimaryKeyConstraint ('id' )
36+ )
37+
38+ # Create Exercise table
39+ op .create_table (
40+ 'exercise' ,
41+ sa .Column ('id' , postgresql .UUID (), nullable = False ),
42+ sa .Column ('workout_id' , postgresql .UUID (), nullable = False ),
43+ sa .Column ('name' , sa .String (), nullable = False ),
44+ sa .Column ('description' , sa .String (), nullable = True ),
45+ sa .Column ('category' , sa .String (), nullable = False ),
46+ sa .Column ('sets' , sa .Integer (), nullable = True ),
47+ sa .Column ('reps' , sa .Integer (), nullable = True ),
48+ sa .Column ('weight' , sa .Float (), nullable = True ),
49+ sa .Column ('created_at' , sa .DateTime (), nullable = False ),
50+ sa .Column ('updated_at' , sa .DateTime (), nullable = True ),
51+ sa .ForeignKeyConstraint (['workout_id' ], ['workout.id' ], ondelete = 'CASCADE' ),
52+ sa .PrimaryKeyConstraint ('id' )
53+ )
54+
55+ # Add indexes for better query performance
56+ op .create_index (op .f ('ix_workout_user_id' ), 'workout' , ['user_id' ], unique = False )
57+ op .create_index (op .f ('ix_workout_scheduled_date' ), 'workout' , ['scheduled_date' ], unique = False )
58+ op .create_index (op .f ('ix_workout_is_completed' ), 'workout' , ['is_completed' ], unique = False )
59+ op .create_index (op .f ('ix_exercise_workout_id' ), 'exercise' , ['workout_id' ], unique = False )
60+ op .create_index (op .f ('ix_exercise_category' ), 'exercise' , ['category' ], unique = False )
61+
62+
63+ def downgrade ():
64+ # Drop indexes
65+ op .drop_index (op .f ('ix_exercise_category' ), table_name = 'exercise' )
66+ op .drop_index (op .f ('ix_exercise_workout_id' ), table_name = 'exercise' )
67+ op .drop_index (op .f ('ix_workout_is_completed' ), table_name = 'workout' )
68+ op .drop_index (op .f ('ix_workout_scheduled_date' ), table_name = 'workout' )
69+ op .drop_index (op .f ('ix_workout_user_id' ), table_name = 'workout' )
70+
71+ # Drop tables
72+ op .drop_table ('exercise' )
73+ op .drop_table ('workout' )
0 commit comments