Automated Action 0186fc8e70 Create movie database backend with FastAPI and SQLite
This commit implements a simple movie database backend inspired by IMDb. It includes:
- API endpoints for movies, actors, directors and genres
- SQLAlchemy models with relationships
- Alembic migrations
- Pydantic schemas for request/response validation
- Search and filtering functionality
- Health check endpoint
- Complete documentation
2025-05-19 20:28:07 +00:00

109 lines
4.5 KiB
Python

"""Initial schema
Revision ID: 001
Revises:
Create Date: 2023-11-27
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision: str = '001'
down_revision: Union[str, None] = None
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_table('actor',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('name', sa.String(length=255), nullable=False),
sa.Column('birth_date', sa.Date(), nullable=True),
sa.Column('bio', sa.Text(), nullable=True),
sa.Column('photo_path', sa.String(length=255), nullable=True),
sa.PrimaryKeyConstraint('id')
)
op.create_index(op.f('ix_actor_id'), 'actor', ['id'], unique=False)
op.create_index(op.f('ix_actor_name'), 'actor', ['name'], unique=False)
op.create_table('director',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('name', sa.String(length=255), nullable=False),
sa.Column('birth_date', sa.Date(), nullable=True),
sa.Column('bio', sa.Text(), nullable=True),
sa.Column('photo_path', sa.String(length=255), nullable=True),
sa.PrimaryKeyConstraint('id')
)
op.create_index(op.f('ix_director_id'), 'director', ['id'], unique=False)
op.create_index(op.f('ix_director_name'), 'director', ['name'], unique=False)
op.create_table('genre',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('name', sa.String(length=50), nullable=False),
sa.PrimaryKeyConstraint('id')
)
op.create_index(op.f('ix_genre_id'), 'genre', ['id'], unique=False)
op.create_index(op.f('ix_genre_name'), 'genre', ['name'], unique=True)
op.create_table('movie',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('title', sa.String(length=255), nullable=False),
sa.Column('release_date', sa.Date(), nullable=True),
sa.Column('overview', sa.Text(), nullable=True),
sa.Column('poster_path', sa.String(length=255), nullable=True),
sa.Column('runtime', sa.Integer(), nullable=True),
sa.Column('rating', sa.Float(), nullable=True),
sa.Column('director_id', sa.Integer(), nullable=True),
sa.ForeignKeyConstraint(['director_id'], ['director.id'], ),
sa.PrimaryKeyConstraint('id')
)
op.create_index(op.f('ix_movie_id'), 'movie', ['id'], unique=False)
op.create_index(op.f('ix_movie_title'), 'movie', ['title'], unique=False)
op.create_table('movieactor',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('movie_id', sa.Integer(), nullable=False),
sa.Column('actor_id', sa.Integer(), nullable=False),
sa.Column('character_name', sa.String(length=255), nullable=True),
sa.ForeignKeyConstraint(['actor_id'], ['actor.id'], ),
sa.ForeignKeyConstraint(['movie_id'], ['movie.id'], ),
sa.PrimaryKeyConstraint('id')
)
op.create_index(op.f('ix_movieactor_id'), 'movieactor', ['id'], unique=False)
op.create_table('moviegenre',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('movie_id', sa.Integer(), nullable=False),
sa.Column('genre_id', sa.Integer(), nullable=False),
sa.ForeignKeyConstraint(['genre_id'], ['genre.id'], ),
sa.ForeignKeyConstraint(['movie_id'], ['movie.id'], ),
sa.PrimaryKeyConstraint('id')
)
op.create_index(op.f('ix_moviegenre_id'), 'moviegenre', ['id'], unique=False)
# ### end Alembic commands ###
def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_index(op.f('ix_moviegenre_id'), table_name='moviegenre')
op.drop_table('moviegenre')
op.drop_index(op.f('ix_movieactor_id'), table_name='movieactor')
op.drop_table('movieactor')
op.drop_index(op.f('ix_movie_title'), table_name='movie')
op.drop_index(op.f('ix_movie_id'), table_name='movie')
op.drop_table('movie')
op.drop_index(op.f('ix_genre_name'), table_name='genre')
op.drop_index(op.f('ix_genre_id'), table_name='genre')
op.drop_table('genre')
op.drop_index(op.f('ix_director_name'), table_name='director')
op.drop_index(op.f('ix_director_id'), table_name='director')
op.drop_table('director')
op.drop_index(op.f('ix_actor_name'), table_name='actor')
op.drop_index(op.f('ix_actor_id'), table_name='actor')
op.drop_table('actor')
# ### end Alembic commands ###