"""Add mini_stories table Revision ID: 20251209_mini_stories Revises: 20251209_word_of_day Create Date: 2024-12-09 """ from typing import Sequence, Union from alembic import op import sqlalchemy as sa from sqlalchemy.dialects import postgresql # revision identifiers, used by Alembic. revision: str = '20251209_mini_stories' down_revision: Union[str, None] = '20251209_word_of_day' branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: # Удаляем старую таблицу и enum если существуют op.execute("DROP TABLE IF EXISTS mini_stories CASCADE") op.execute("DROP TYPE IF EXISTS storygenre CASCADE") # Создаём enum через raw SQL op.execute("CREATE TYPE storygenre AS ENUM ('dialogue', 'news', 'story', 'letter', 'recipe')") # Создаём таблицу используя postgresql.ENUM с create_type=False story_genre = postgresql.ENUM('dialogue', 'news', 'story', 'letter', 'recipe', name='storygenre', create_type=False) op.create_table( 'mini_stories', sa.Column('id', sa.Integer(), nullable=False), sa.Column('user_id', sa.Integer(), nullable=False), sa.Column('title', sa.String(length=255), nullable=False), sa.Column('content', sa.String(length=5000), nullable=False), sa.Column('genre', story_genre, nullable=False), sa.Column('learning_lang', sa.String(length=5), nullable=False), sa.Column('level', sa.String(length=5), nullable=False), sa.Column('word_count', sa.Integer(), nullable=True, server_default='0'), sa.Column('vocabulary', sa.JSON(), nullable=True), sa.Column('questions', sa.JSON(), nullable=True), sa.Column('is_completed', sa.Boolean(), nullable=True, server_default='false'), sa.Column('correct_answers', sa.Integer(), nullable=True, server_default='0'), sa.Column('created_at', sa.DateTime(), nullable=True), sa.PrimaryKeyConstraint('id') ) op.create_index('ix_mini_stories_user_id', 'mini_stories', ['user_id'], unique=False) def downgrade() -> None: op.drop_index('ix_mini_stories_user_id', table_name='mini_stories') op.drop_table('mini_stories') op.execute("DROP TYPE IF EXISTS storygenre CASCADE")