From 7c2ae08c74a7ede99aeb9d6b541931aadf60b3aa Mon Sep 17 00:00:00 2001 From: Floke Date: Mon, 19 Jan 2026 11:37:55 +0000 Subject: [PATCH] fix: Update Notion sync logic to handle existing records and avoid unique constraint errors --- .../backend/scripts/sync_notion_industries.py | 33 +++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/company-explorer/backend/scripts/sync_notion_industries.py b/company-explorer/backend/scripts/sync_notion_industries.py index 8ec790be..5fdee19c 100644 --- a/company-explorer/backend/scripts/sync_notion_industries.py +++ b/company-explorer/backend/scripts/sync_notion_industries.py @@ -79,29 +79,22 @@ def sync_categories(token, session): notion_id = page["id"] name = extract_title(props.get("Name")) - # In the inspected DB, there was no 'key' or 'description' obvious, checking props again: - # Properties: Constrains, Product Category, Text, Product Categories, Name - # Wait, the inspection output was: - # - Constrains (rich_text) - # - Product Category (relation) - # - Text (rich_text) - # - Product Categories (relation) - # - Name (title) - - # It seems the schema might be slightly different than expected or I looked at the wrong DB. - # But 'Name' is there. I'll use Name as Key (lowercase) for now. - # And 'Text' as Description? description = extract_rich_text(props.get("Text")) key = name.lower().replace(" ", "_") if name else "unknown" if not name: continue - # Upsert + # Upsert Logic: Check ID -> Check Key -> Create cat = session.query(RoboticsCategory).filter(RoboticsCategory.notion_id == notion_id).first() if not cat: - cat = RoboticsCategory(notion_id=notion_id, key=key) - session.add(cat) + cat = session.query(RoboticsCategory).filter(RoboticsCategory.key == key).first() + if cat: + logger.info(f"Linked existing category '{key}' to Notion ID {notion_id}") + cat.notion_id = notion_id + else: + cat = RoboticsCategory(notion_id=notion_id, key=key) + session.add(cat) cat.name = name cat.description = description @@ -125,10 +118,16 @@ def sync_industries(token, session): name = extract_title(props.get("Industry")) if not name: continue + # Upsert Logic: Check ID -> Check Name -> Create industry = session.query(Industry).filter(Industry.notion_id == notion_id).first() if not industry: - industry = Industry(notion_id=notion_id) - session.add(industry) + industry = session.query(Industry).filter(Industry.name == name).first() + if industry: + logger.info(f"Linked existing industry '{name}' to Notion ID {notion_id}") + industry.notion_id = notion_id + else: + industry = Industry(notion_id=notion_id, name=name) + session.add(industry) # Map Fields industry.name = name