"""initial Revision ID: 001 Revises: Create Date: 2024-01-01 00:00:00.000000 """ from typing import Sequence, Union import sqlalchemy as sa from alembic import op 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: op.create_table( "stores", sa.Column("id", sa.Integer(), primary_key=True), sa.Column("name", sa.String(100), nullable=False), sa.Column("slug", sa.String(50), nullable=False), sa.Column("country", sa.String(2), server_default="NL"), sa.Column("website", sa.String(255)), sa.UniqueConstraint("slug", name="uq_stores_slug"), ) op.create_table( "products", sa.Column("id", sa.Integer(), primary_key=True), sa.Column("store_id", sa.Integer(), sa.ForeignKey("stores.id"), nullable=False), sa.Column("external_id", sa.String(50), nullable=False), sa.Column("ean", sa.String(20)), sa.Column("name", sa.String(255), nullable=False), sa.Column("brand", sa.String(100)), sa.Column("category", sa.String(100)), sa.Column("unit_size", sa.String(50)), sa.Column("url", sa.String(500)), sa.Column("created_at", sa.DateTime(), server_default=sa.func.now()), sa.Column("updated_at", sa.DateTime(), server_default=sa.func.now()), sa.UniqueConstraint("store_id", "external_id", name="uq_products_store_external"), ) op.create_index("ix_products_ean", "products", ["ean"]) op.create_table( "scrape_runs", sa.Column("id", sa.Integer(), primary_key=True), sa.Column("store_id", sa.Integer(), sa.ForeignKey("stores.id"), nullable=False), sa.Column("query", sa.String(255), nullable=False), sa.Column("started_at", sa.DateTime(), server_default=sa.func.now()), sa.Column("finished_at", sa.DateTime()), sa.Column("status", sa.String(20), server_default="running"), sa.Column("products_found", sa.Integer(), server_default="0"), sa.Column("error_message", sa.String(1000)), ) op.create_table( "price_snapshots", sa.Column("id", sa.Integer(), primary_key=True), sa.Column("product_id", sa.Integer(), sa.ForeignKey("products.id"), nullable=False), sa.Column("scrape_run_id", sa.Integer(), sa.ForeignKey("scrape_runs.id"), nullable=False), sa.Column("price", sa.Integer(), nullable=False), sa.Column("unit_price", sa.Integer()), sa.Column("unit_description", sa.String(50)), sa.Column("currency", sa.String(3), server_default="EUR"), sa.Column("discount_label", sa.String(100)), sa.Column("discount_description", sa.String(255)), sa.Column("was_price", sa.Integer()), sa.Column("is_on_sale", sa.Boolean(), server_default="false"), sa.Column("timestamp", sa.DateTime(), server_default=sa.func.now()), ) op.create_index("ix_price_snapshots_timestamp", "price_snapshots", ["timestamp"]) op.create_index( "ix_price_snapshots_product_timestamp", "price_snapshots", ["product_id", "timestamp"], ) def downgrade() -> None: op.drop_table("price_snapshots") op.drop_table("scrape_runs") op.drop_table("products") op.drop_table("stores")