
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
109 lines
4.5 KiB
Python
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 ### |