"""Initial schema — cars, images, sync_runs Revision ID: 001_initial Revises: Create Date: 2026-04-08 """ from typing import Sequence, Union from alembic import op import sqlalchemy as sa revision: str = "001_initial" 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: # --- cars --- op.create_table( "cars", sa.Column("id", sa.BigInteger, primary_key=True, autoincrement=True), sa.Column("parser_id", sa.String(50), nullable=False, unique=True), sa.Column("brand", sa.String(50), nullable=False), sa.Column("model", sa.String(50), nullable=False), sa.Column("year", sa.Integer, nullable=True), sa.Column("price", sa.BigInteger, nullable=True), sa.Column("currency", sa.String(10), nullable=False, server_default="USD"), sa.Column("mileage", sa.Integer, nullable=False, server_default="0"), sa.Column("country", sa.String(10), nullable=False, server_default="NA"), sa.Column("is_sold", sa.Boolean, nullable=False, server_default=sa.text("false")), sa.Column("color", sa.String, nullable=False, server_default="other"), sa.Column("drive", sa.String(10), nullable=True), sa.Column("gearbox", sa.String(10), nullable=True), sa.Column("steering_wheel", sa.String(10), nullable=True), sa.Column("body_type", sa.String(20), nullable=False, server_default="OTHER"), sa.Column("engine_volume", sa.Integer, nullable=True), sa.Column("selling_type", sa.String(20), nullable=False, server_default="NA"), sa.Column("one_owner", sa.Boolean, nullable=False, server_default=sa.text("false")), sa.Column("new_car", sa.Boolean, nullable=False, server_default=sa.text("false")), sa.Column("is_hidden", sa.Boolean, nullable=False, server_default=sa.text("false")), sa.Column("origin", sa.String(20), nullable=False, server_default="NA"), sa.Column("origin_url", sa.String, nullable=False), sa.Column("origin_id", sa.String, nullable=False, unique=True), sa.Column("is_damaged", sa.Boolean, nullable=False, server_default=sa.text("false")), sa.Column("evaluation", sa.String, nullable=True), sa.Column("non_smoking", sa.Boolean, nullable=False, server_default=sa.text("true")), sa.Column("rental", sa.Boolean, nullable=False, server_default=sa.text("false")), sa.Column("repair_history", sa.Boolean, nullable=False, server_default=sa.text("false")), sa.Column("slug", sa.String, nullable=False), sa.Column("last_seen_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.func.now()), ) op.create_index("ix_cars_origin_url", "cars", ["origin_url"]) op.create_index("ix_cars_origin_id", "cars", ["origin_id"], unique=True) # --- images --- op.create_table( "images", sa.Column("id", sa.BigInteger, primary_key=True, autoincrement=True), sa.Column("fullres_image", sa.String, nullable=False), sa.Column("preview_image", sa.String, nullable=False), sa.Column("order_index", sa.Integer, nullable=False), sa.Column("car_id", sa.Integer, sa.ForeignKey("cars.id", ondelete="CASCADE"), nullable=False), ) # --- sync_runs --- op.create_table( "sync_runs", sa.Column("id", sa.BigInteger, primary_key=True, autoincrement=True), sa.Column("started_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.func.now()), sa.Column("finished_at", sa.DateTime(timezone=True), nullable=True), sa.Column("status", sa.Text, nullable=False), sa.Column("lane", sa.Text, nullable=False), sa.Column("ids_fetched", sa.Integer, nullable=False, server_default="0"), sa.Column("cars_upserted", sa.Integer, nullable=False, server_default="0"), sa.Column("cars_failed", sa.Integer, nullable=False, server_default="0"), sa.Column("images_upserted", sa.Integer, nullable=False, server_default="0"), sa.Column("error_summary", sa.Text, nullable=True), ) def downgrade() -> None: op.drop_table("sync_runs") op.drop_table("images") op.drop_table("cars")