Войти Регистрация
Код-ревью

16. Импорт остатков склада из CSV

Сложная

Python · 39 строк

Продавец загружает CSV с колонками sku;qty — сколько товара сейчас лежит на его складе. Файлы до 200 000 строк, продавец часто загружает один и тот же файл повторно, если не уверен, что первая загрузка прошла.

Отметьте строки с ошибками.

В работе: Личный кабинет продавца, раздел «Остатки»: схема FBS, продавец хранит товар у себя.

Как проверяем Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Ответ один на подход: после него показываем разбор.
ресурсыSQLN+1идемпотентностьтранзакции

Источник: на задачах Ozon: остатки продавцов на складах. Условие пересказано своими словами.

Давали на собеседовании? Ответов пока мало — ваш поможет.
  1. import csv
  2. import logging
  3. import psycopg2
  4. log = logging.getLogger(__name__)
  5. def import_stocks(path, warehouse_id, dsn):
  6. conn = psycopg2.connect(dsn)
  7. cur = conn.cursor()
  8. f = open(path, encoding="utf-8")
  9. reader = csv.DictReader(f, delimiter=";")
  10. updated = 0
  11. for row in reader:
  12. sku = row["sku"].strip()
  13. qty = int(row["qty"])
  14. cur.execute(f"SELECT id FROM products WHERE sku = '{sku}'")
  15. product = cur.fetchone()
  16. if product is None:
  17. log.warning("unknown sku %s", sku)
  18. continue
  19. cur.execute(
  20. "SELECT qty FROM stocks WHERE product_id = %s AND warehouse_id = %s",
  21. (product[0], warehouse_id),
  22. )
  23. if cur.fetchone():
  24. cur.execute(
  25. "UPDATE stocks SET qty = qty + %s WHERE product_id = %s AND warehouse_id = %s",
  26. (qty, product[0], warehouse_id),
  27. )
  28. else:
  29. cur.execute(
  30. "INSERT INTO stocks(product_id, warehouse_id, qty) VALUES (%s, %s, %s)",
  31. (product[0], warehouse_id, qty),
  32. )
  33. conn.commit()
  34. updated += 1
  35. return updated