42 lines
1.4 KiB
Python
42 lines
1.4 KiB
Python
from __future__ import annotations
|
||
|
||
"""Вторая миграция: ограничивает значения заказов 1 в день по каждой категории."""
|
||
|
||
import sqlite3
|
||
from pathlib import Path
|
||
|
||
MIGRATION_ID = "0002_cap_orders_to_one"
|
||
DESCRIPTION = "Cap daily orders per category at 1 for each client/day (values >1 -> 1)"
|
||
|
||
ORDER_COLS = [
|
||
"orders_amt_ent",
|
||
"orders_amt_super",
|
||
"orders_amt_transport",
|
||
"orders_amt_shopping",
|
||
"orders_amt_hotel",
|
||
"orders_amt_avia",
|
||
]
|
||
|
||
|
||
def run(context) -> None:
|
||
# Работаем с уже собранной SQLite, путь берём из контекста мигратора
|
||
dataset_dir = Path(getattr(context, "dataset_dir", Path.cwd()))
|
||
sqlite_path = getattr(context, "sqlite_path", dataset_dir / "ds.sqlite")
|
||
|
||
if not sqlite_path.exists():
|
||
raise FileNotFoundError(f"SQLite database not found: {sqlite_path}")
|
||
|
||
conn = sqlite3.connect(sqlite_path)
|
||
try:
|
||
# Каждую колонку приводим к максимуму 1, чтобы убрать аномальные значения
|
||
for col in ORDER_COLS:
|
||
sql = f"""
|
||
UPDATE communications
|
||
SET {col} = CASE WHEN {col} > 1 THEN 1 ELSE {col} END
|
||
"""
|
||
conn.execute(sql)
|
||
conn.commit()
|
||
print(f"Capped values >1 to 1 in columns: {', '.join(ORDER_COLS)}")
|
||
finally:
|
||
conn.close()
|