global_tree_element_repo.py 924 B

123456789101112131415161718192021222324252627
  1. from __future__ import annotations
  2. from sqlalchemy.dialects.mysql import insert
  3. from supply_infra.db.models.global_tree_element import GlobalTreeElement
  4. from supply_infra.db.repositories.base import BaseRepository
  5. _BATCH_SIZE = 1000
  6. class GlobalTreeElementRepository(BaseRepository[GlobalTreeElement]):
  7. """全局树元素表 — INSERT IGNORE 按 (name, category_id) 唯一键去重。"""
  8. model = GlobalTreeElement
  9. def bulk_insert_ignore(self, rows: list[dict]) -> int:
  10. """批量插入,MySQL 自动忽略 (name, category_id) 重复行。"""
  11. if not rows:
  12. return 0
  13. inserted = 0
  14. for i in range(0, len(rows), _BATCH_SIZE):
  15. batch = rows[i : i + _BATCH_SIZE]
  16. stmt = insert(GlobalTreeElement).values(batch).prefix_with("IGNORE")
  17. result = self.session.execute(stmt)
  18. inserted += result.rowcount
  19. return inserted