80 lines
4.2 KiB
Python
80 lines
4.2 KiB
Python
# Начальная схема: cars, images, sync_runs
|
|
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")
|