Я создаю сценарий синхронизации для извлечения электронных писем из определенной папки Outlook в базу данных Django с помощью pywin32. Чтобы оптимизировать производительность и избежать избыточных запросов к базе данных, я использую set() для хранения снимков существующих записей для поиска. Однако я по-прежнему вижу повторяющиеся записи в своей базе данных.
Моя среда:
ОС: Windows 10
Outlook: 2016
Tech Stack: Python 3.13, Django 5.1.4, pywin32
База данных: SQLite
Логика (минимальный воспроизводимый пример):
часовой пояс
TIME_ZONE = 'UTC' # I also tried 'Asia/Ho_Chi_Minh'
USE_TZ = True
модель
class FloorRequest(models.Model):
request_type = models.CharField(max_length=10) # 'BADGE' or 'FLOOR'
email = models.EmailField()
request_time = models.DateTimeField() # This is where I compare timestamps
mail_entry_id = models.CharField(max_length=255, unique=True)
Я создаю сценарий синхронизации для извлечения электронных писем из определенной папки Outlook в базу данных Django с помощью pywin32. Чтобы оптимизировать производительность и избежать избыточных запросов к базе данных, я использую set() для хранения снимков существующих записей для поиска. Однако я по-прежнему вижу повторяющиеся записи в своей базе данных. Моя среда: [list] [*][b]ОС:[/b] Windows 10
[/list] Логика (минимальный воспроизводимый пример): часовой пояс TIME_ZONE = 'UTC' # I also tried 'Asia/Ho_Chi_Minh' USE_TZ = True
модель class FloorRequest(models.Model): request_type = models.CharField(max_length=10) # 'BADGE' or 'FLOOR' email = models.EmailField() request_time = models.DateTimeField() # This is where I compare timestamps mail_entry_id = models.CharField(max_length=255, unique=True)
Питон def backfill_all() -> None: items = t1_folder.Items item_list = [i for i in items] existing_records = set( FloorRequest.objects.values_list('email', 'request_time', 'request_type') )
count = 0 for item in item_list: try: sender = str(getattr(item, "SenderEmailAddress", "")).lower().strip() received_time = item.ReceivedTime.replace(tzinfo=None) # Naive datetime current_type = 'BADGE' if "badge" in item.Subject.lower() else 'FLOOR' if (sender, received_time, current_type) not in existing_records: FloorRequest.objects.create( email=sender, request_time=received_time, request_type=current_type, ) existing_records.add((sender, received_time, current_type)) count += 1 except Exception as e: continue
raw_name = parsed.get("name") если не raw_name: raw_name = subject.split("s")[0] если "s" в теме else "Unknown" FloorRequest.objects.create( request_type=current_type, name=raw_name.strip()[:255], email=parsed.get("email") or sender, badge_id=parsed.get("badge_id", ""), badge_type=parsed.get("badge_type", ""), floor=parsed.get("floor", ""), project=parsed.get("project", ""), nationality=parsed.get("nationality", ""), id_type=parsed.get("id_type", ""), id_number=parsed.get("id_number", ""), job_title=parsed.get("job_title", ""), gender=parsed.get("gender", ""), arrival_date=parsed.get("arrival_date", ""), mail_subject=subject, mail_entry_id=entry_id, photo=f"request_photos/{photo_filename}" if photo_filename else None, request_time=mail_date_naive, is_read=False, is_processed=False, )