gadem
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
from __future__ import annotations
|
||||
|
||||
"""Первая миграция: переносит сырое CSV в SQLite и создаёт индексы."""
|
||||
|
||||
import sqlite3
|
||||
from pathlib import Path
|
||||
|
||||
@@ -13,6 +15,7 @@ TABLE_NAME = "communications"
|
||||
|
||||
|
||||
def run(context) -> None:
|
||||
# Определяем пути и режим выполнения (force позволяет пересоздать БД)
|
||||
dataset_dir = Path(getattr(context, "dataset_dir", Path.cwd()))
|
||||
csv_path = getattr(context, "csv_path", dataset_dir / "ds.csv")
|
||||
sqlite_path = getattr(context, "sqlite_path", dataset_dir / "ds.sqlite")
|
||||
@@ -31,6 +34,7 @@ def run(context) -> None:
|
||||
sqlite_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
conn = sqlite3.connect(sqlite_path)
|
||||
try:
|
||||
# Читаем CSV чанками, нормализуем дату и пишем в таблицу communications
|
||||
first_chunk = True
|
||||
for chunk in pd.read_csv(csv_path, chunksize=CHUNK_SIZE):
|
||||
chunk["business_dt"] = pd.to_datetime(chunk["business_dt"]).dt.strftime("%Y-%m-%d")
|
||||
@@ -41,6 +45,7 @@ def run(context) -> None:
|
||||
if first_chunk:
|
||||
raise RuntimeError("Source CSV is empty, no rows were written to SQLite")
|
||||
|
||||
# Добавляем индексы, чтобы последующие выборки работали быстрее
|
||||
conn.execute(f"CREATE INDEX IF NOT EXISTS idx_{TABLE_NAME}_id ON {TABLE_NAME}(id)")
|
||||
conn.execute(f"CREATE INDEX IF NOT EXISTS idx_{TABLE_NAME}_business_dt ON {TABLE_NAME}(business_dt)")
|
||||
conn.commit()
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
from __future__ import annotations
|
||||
|
||||
"""Вторая миграция: ограничивает значения заказов 1 в день по каждой категории."""
|
||||
|
||||
import sqlite3
|
||||
from pathlib import Path
|
||||
|
||||
@@ -17,6 +19,7 @@ ORDER_COLS = [
|
||||
|
||||
|
||||
def run(context) -> None:
|
||||
# Работаем с уже собранной SQLite, путь берём из контекста мигратора
|
||||
dataset_dir = Path(getattr(context, "dataset_dir", Path.cwd()))
|
||||
sqlite_path = getattr(context, "sqlite_path", dataset_dir / "ds.sqlite")
|
||||
|
||||
@@ -25,6 +28,7 @@ def run(context) -> None:
|
||||
|
||||
conn = sqlite3.connect(sqlite_path)
|
||||
try:
|
||||
# Каждую колонку приводим к максимуму 1, чтобы убрать аномальные значения
|
||||
for col in ORDER_COLS:
|
||||
sql = f"""
|
||||
UPDATE communications
|
||||
|
||||
Reference in New Issue
Block a user