From 7ce03cdd62893cd10851686ecd6442bf249e4e3f Mon Sep 17 00:00:00 2001 From: Christoph Fink Date: Wed, 16 Apr 2025 12:01:08 +0200 Subject: [PATCH 1/2] fix database schema updater --- .../basicflickrhistorydownloader.py | 6 ++ .../database/databaseschemaupdater.py | 68 ++++++++++++++----- src/flickrhistory/database/session.py | 1 + 3 files changed, 58 insertions(+), 17 deletions(-) diff --git a/src/flickrhistory/basicflickrhistorydownloader.py b/src/flickrhistory/basicflickrhistorydownloader.py index 227a7a7..4f7ccc3 100644 --- a/src/flickrhistory/basicflickrhistorydownloader.py +++ b/src/flickrhistory/basicflickrhistorydownloader.py @@ -21,6 +21,7 @@ from .cache import Cache from .cacheupdaterthread import CacheUpdaterThread from .config import Config +from .database import Session from .licensedownloader import LicenseDownloader from .photodownloaderthread import PhotoDownloaderThread from .photoupdaterthread import PhotoUpdaterThread @@ -56,6 +57,11 @@ def __init__(self): def download(self): """Download all georeferenced flickr posts.""" + + # create a session to initialise the database + _ = Session() + + # download an updated list of possible licenses LicenseDownloader(self._api_key_manager).update_licenses() for gap in self.gaps_in_download_history: diff --git a/src/flickrhistory/database/databaseschemaupdater.py b/src/flickrhistory/database/databaseschemaupdater.py index bbeb866..677083d 100644 --- a/src/flickrhistory/database/databaseschemaupdater.py +++ b/src/flickrhistory/database/databaseschemaupdater.py @@ -20,22 +20,55 @@ SCHEMA_UPDATES = { # 0 -> 1 1: """ - ALTER TABLE - photos - ADD COLUMN IF NOT EXISTS - geo_accuracy SMALLINT; - - CREATE TABLE IF NOT EXISTS - licenses ( - id INTEGER, - name TEXT, - url TEXT - ); - - ALTER TABLE - photos - ADD COLUMN IF NOT EXISTS - license INTEGER REFERENCES licenses(id); + CREATE TABLE licenses ( + id integer NOT NULL, + name text, + url text + ); + + CREATE SEQUENCE licenses_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + ALTER SEQUENCE licenses_id_seq OWNED BY licenses.id; + + ALTER TABLE ONLY photos ADD COLUMN geo_accuracy SMALLINT, ADD COLUMN license_id INTEGER; + + CREATE TABLE tag_photo_associations ( + tag_tag text NOT NULL, + photo_id bigint NOT NULL + ); + + CREATE TABLE tags ( + tag text NOT NULL + ); + + ALTER TABLE ONLY licenses ALTER COLUMN id SET DEFAULT nextval('licenses_id_seq'::regclass); + + ALTER TABLE ONLY licenses + ADD CONSTRAINT licenses_pkey PRIMARY KEY (id); + + ALTER TABLE ONLY tag_photo_associations + ADD CONSTRAINT tag_photo_associations_pkey PRIMARY KEY (tag_tag, photo_id); + + ALTER TABLE ONLY tags + ADD CONSTRAINT tags_pkey PRIMARY KEY (tag); + + CREATE INDEX ix_photos_license_id ON photos USING btree (license_id); + + ALTER TABLE ONLY photos RENAME CONSTRAINT "FlickrUser" TO "User"; + + ALTER TABLE ONLY photos ADD CONSTRAINT photos_license_id_fkey FOREIGN KEY (license_id) REFERENCES licenses(id); + + ALTER TABLE ONLY tag_photo_associations + ADD CONSTRAINT tag_photo_associations_photo_id_fkey FOREIGN KEY (photo_id) REFERENCES photos(id); + + ALTER TABLE ONLY tag_photo_associations + ADD CONSTRAINT tag_photo_associations_tag_tag_fkey FOREIGN KEY (tag_tag) REFERENCES tags(tag); """, } @@ -94,9 +127,10 @@ def update_to_latest(self): file=sys.stderr, flush=True, # so that we don’t seem without work ) - with self.engine.connect() as connection: + with self.engine.begin() as connection: next_version = self.installed_version + 1 connection.execute(sqlalchemy.text(SCHEMA_UPDATES[next_version])) + connection.commit() self.set_schema_version(next_version) installed_version = self.installed_version diff --git a/src/flickrhistory/database/session.py b/src/flickrhistory/database/session.py index 93acd50..3e97bd6 100644 --- a/src/flickrhistory/database/session.py +++ b/src/flickrhistory/database/session.py @@ -49,6 +49,7 @@ def __new__(cls, *args, **kwargs): if sqlalchemy.inspect(engine).has_table(Photo.__table__.name): # data exist DatabaseSchemaUpdater().update_to_latest() + Base.metadata.create_all(engine, checkfirst=True) else: Base.metadata.create_all(engine) DatabaseSchemaUpdater().set_schema_version(DatabaseSchemaUpdater.LATEST) From 0ffeb212066899508baec6d811f38a5e484ec98e Mon Sep 17 00:00:00 2001 From: Christoph Fink Date: Wed, 16 Apr 2025 12:03:16 +0200 Subject: [PATCH 2/2] linted --- src/flickrhistory/basicflickrhistorydownloader.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/flickrhistory/basicflickrhistorydownloader.py b/src/flickrhistory/basicflickrhistorydownloader.py index 4f7ccc3..29deb0e 100644 --- a/src/flickrhistory/basicflickrhistorydownloader.py +++ b/src/flickrhistory/basicflickrhistorydownloader.py @@ -57,7 +57,6 @@ def __init__(self): def download(self): """Download all georeferenced flickr posts.""" - # create a session to initialise the database _ = Session()