From 9193a2e48d121058e93da6026880001fd286f0e7 Mon Sep 17 00:00:00 2001 From: Christoph Fink Date: Wed, 16 Apr 2025 12:16:05 +0200 Subject: [PATCH] fix duplicate keys --- CHANGELOG.md | 3 +++ src/flickrhistory/__init__.py | 2 +- src/flickrhistory/database/photo_saver.py | 12 ++++++++---- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a6d1e8..bd814cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +- **0.3.1** (2025-04-16): + - fix race conditions around tags (duplicate keys) + - **0.3.0** (2025-04-15): - now collecting more data: tags, license, geo-accuracy - re-downloading these data for existing records diff --git a/src/flickrhistory/__init__.py b/src/flickrhistory/__init__.py index f68ee96..bd033b2 100644 --- a/src/flickrhistory/__init__.py +++ b/src/flickrhistory/__init__.py @@ -15,4 +15,4 @@ except ImportError: pass -__version__ = "0.3.0.post1" +__version__ = "0.3.1" diff --git a/src/flickrhistory/database/photo_saver.py b/src/flickrhistory/database/photo_saver.py index 15fce83..16b967f 100644 --- a/src/flickrhistory/database/photo_saver.py +++ b/src/flickrhistory/database/photo_saver.py @@ -7,6 +7,8 @@ import datetime +import sqlalchemy + from .models import License, Photo, Tag from .session import Session from .user_saver import UserSaver @@ -108,10 +110,12 @@ def save(self, data): photo.update(**photo_data) photo.tags = [] - for tag in tags: - tag = session.merge(session.get(Tag, tag) or Tag(tag=tag)) - if tag not in photo.tags: - photo.tags.append(tag) + for tag in set(tags): + try: + with session.begin_nested(): + photo.tags.append(session.merge(Tag(tag=tag))) + except sqlalchemy.exc.IntegrityError: + photo.tags.append(session.get(Tag, tag)) license = session.merge( session.get(License, license) or License(id=license)