"""Начальная схема базы данных. Revision ID: 001 Revises: Create Date: 2024-01-01 00:00:00.000000 Создаёт таблицы: users, tasks, documents, fingerprints, usage_logs """ from alembic import op import sqlalchemy as sa # revision identifiers revision = "001" down_revision = None branch_labels = None depends_on = None def upgrade() -> None: """Создать все таблицы.""" # ── users ────────────────────────────────────────────────────────────────── op.create_table( "users", sa.Column("id", sa.Integer(), primary_key=True, autoincrement=True), sa.Column("email", sa.String(255), nullable=False), sa.Column("hashed_password", sa.String(255), nullable=False), sa.Column("name", sa.String(255), nullable=False), sa.Column("is_verified", sa.Boolean(), nullable=False, server_default="false"), sa.Column("plan", sa.String(20), nullable=False, server_default="free"), sa.Column("verification_token", sa.String(255), nullable=True), sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now()), sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.func.now()), ) op.create_index("ix_users_email", "users", ["email"], unique=True) # ── tasks ────────────────────────────────────────────────────────────────── op.create_table( "tasks", sa.Column("id", sa.String(36), primary_key=True), sa.Column("user_id", sa.Integer(), sa.ForeignKey("users.id", ondelete="CASCADE")), sa.Column("type", sa.String(20), nullable=False), sa.Column("status", sa.String(20), nullable=False, server_default="queued"), sa.Column("celery_task_id", sa.String(255), nullable=True), sa.Column("input_data", sa.JSON(), nullable=False, server_default="{}"), sa.Column("result", sa.JSON(), nullable=True), sa.Column("error", sa.Text(), nullable=True), sa.Column("queue_position", sa.Integer(), nullable=True), sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now()), sa.Column("updated_at", sa.DateTime(timezone=True), nullable=True), ) op.create_index("ix_tasks_user_id", "tasks", ["user_id"]) op.create_index("ix_tasks_status", "tasks", ["status"]) # ── documents ────────────────────────────────────────────────────────────── op.create_table( "documents", sa.Column("id", sa.Integer(), primary_key=True, autoincrement=True), sa.Column("source", sa.String(50), nullable=False), sa.Column("ext_id", sa.String(255), nullable=False), sa.Column("doi", sa.String(255), nullable=True), sa.Column("title", sa.Text(), nullable=False), sa.Column("authors", sa.JSON(), nullable=False, server_default="[]"), sa.Column("year", sa.Integer(), nullable=True), sa.Column("lang", sa.String(10), nullable=True), sa.Column("journal", sa.Text(), nullable=True), sa.Column("volume", sa.String(50), nullable=True), sa.Column("issue", sa.String(50), nullable=True), sa.Column("pages", sa.String(50), nullable=True), sa.Column("abstract", sa.Text(), nullable=True), sa.Column("url", sa.Text(), nullable=True), sa.Column("minio_key", sa.Text(), nullable=True), sa.Column("faiss_id", sa.Integer(), nullable=True), sa.Column("indexed_at", sa.DateTime(timezone=True), server_default=sa.func.now()), ) op.create_index("ix_documents_ext_id", "documents", ["ext_id"], unique=True) op.create_index("ix_documents_doi", "documents", ["doi"]) op.create_index("ix_documents_source", "documents", ["source"]) op.create_index("ix_documents_year", "documents", ["year"]) op.create_index("ix_documents_lang", "documents", ["lang"]) op.create_index("ix_documents_faiss_id", "documents", ["faiss_id"]) # ── fingerprints ─────────────────────────────────────────────────────────── op.create_table( "fingerprints", sa.Column("id", sa.Integer(), primary_key=True, autoincrement=True), sa.Column("doc_id", sa.Integer(), sa.ForeignKey("documents.id", ondelete="CASCADE")), sa.Column("hash_value", sa.BigInteger(), nullable=False), sa.Column("position", sa.Integer(), nullable=False), ) op.create_index("ix_fingerprints_doc_id", "fingerprints", ["doc_id"]) op.create_index("ix_fingerprints_hash_value", "fingerprints", ["hash_value"]) # ── usage_logs ───────────────────────────────────────────────────────────── op.create_table( "usage_logs", sa.Column("id", sa.Integer(), primary_key=True, autoincrement=True), sa.Column("user_id", sa.Integer(), sa.ForeignKey("users.id", ondelete="CASCADE")), sa.Column("action", sa.String(50), nullable=False), sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now()), ) op.create_index("ix_usage_logs_user_id", "usage_logs", ["user_id"]) op.create_index("ix_usage_logs_created_at", "usage_logs", ["created_at"]) def downgrade() -> None: """Удалить все таблицы.""" op.drop_table("usage_logs") op.drop_table("fingerprints") op.drop_table("documents") op.drop_table("tasks") op.drop_table("users")