diff --git a/src/flickrhistory/__init__.py b/src/flickrhistory/__init__.py index fdbe103..2970694 100644 --- a/src/flickrhistory/__init__.py +++ b/src/flickrhistory/__init__.py @@ -15,4 +15,4 @@ except ImportError: pass -__version__ = "0.3.0.dev0" +__version__ = "0.3.0.dev1" diff --git a/src/flickrhistory/database/__init__.py b/src/flickrhistory/database/__init__.py index 900ebaf..21878ca 100644 --- a/src/flickrhistory/database/__init__.py +++ b/src/flickrhistory/database/__init__.py @@ -13,7 +13,7 @@ "UserSaver", ] -from .engine import Session from .models import License, Photo, User from .photo_saver import PhotoSaver +from .session import Session from .user_saver import UserSaver diff --git a/src/flickrhistory/database/databaseschemaupdater.py b/src/flickrhistory/database/databaseschemaupdater.py index ccc4792..bbeb866 100644 --- a/src/flickrhistory/database/databaseschemaupdater.py +++ b/src/flickrhistory/database/databaseschemaupdater.py @@ -12,7 +12,7 @@ import sqlalchemy -from .engine import engine +from ..config import Config # for now, schema updates are SQL only and work on PostgreSQL, only. @@ -48,7 +48,9 @@ class DatabaseSchemaUpdater: def __init__(self): """Update the database schema if necessary.""" # Try to create database table for schema version - with engine.begin() as connection: + with Config() as config: + self.engine = sqlalchemy.create_engine(config["database_connection_string"]) + with self.engine.begin() as connection: connection.execute( sqlalchemy.text( """ @@ -65,7 +67,7 @@ def __init__(self): @property def installed_version(self): """Return current version.""" - with engine.connect() as connection: + with self.engine.connect() as connection: installed_version = connection.execute( sqlalchemy.text( """ @@ -92,18 +94,17 @@ def update_to_latest(self): file=sys.stderr, flush=True, # so that we don’t seem without work ) - with engine.begin() as connection: + with self.engine.connect() as connection: next_version = self.installed_version + 1 connection.execute(sqlalchemy.text(SCHEMA_UPDATES[next_version])) self.set_schema_version(next_version) installed_version = self.installed_version - @classmethod - def set_schema_version(cls, version): + def set_schema_version(self, version): """Set the schema version (without running update scripts).""" - if version == cls.LATEST: + if version == self.LATEST: version = max(SCHEMA_UPDATES.keys()) - with engine.begin() as connection: + with self.engine.begin() as connection: connection.execute( sqlalchemy.text( """ diff --git a/src/flickrhistory/database/engine.py b/src/flickrhistory/database/engine.py deleted file mode 100644 index a36cd75..0000000 --- a/src/flickrhistory/database/engine.py +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - - -"""An SQLAlchemy engine and sessionmaker.""" - - -__all__ = ["engine", "Session"] - - -import multiprocessing - -import sqlalchemy -import sqlalchemy.orm - -from ..config import Config - - -POOL_SIZE = multiprocessing.cpu_count() * 10 - - -with Config() as config: - engine = sqlalchemy.create_engine( - config["database_connection_string"], - pool_size=POOL_SIZE, - max_overflow=POOL_SIZE, - ) - - -if engine.dialect.name == "postgresql": - with engine.connect() as connection: - connection.execute( - sqlalchemy.text( - """ - CREATE EXTENSION IF NOT EXISTS - postgis; - """ - ) - ) - - -Session = sqlalchemy.orm.sessionmaker(engine, autoflush=False) diff --git a/src/flickrhistory/database/models/__init__.py b/src/flickrhistory/database/models/__init__.py index 7098090..729a4a2 100644 --- a/src/flickrhistory/database/models/__init__.py +++ b/src/flickrhistory/database/models/__init__.py @@ -13,19 +13,7 @@ ] -import sqlalchemy - -from ..engine import engine -from .base import Base -from ..databaseschemaupdater import DatabaseSchemaUpdater from .license import License from .photo import Photo from .tag import Tag from .user import User - - -if sqlalchemy.inspect(engine).has_table(Photo.__table__.name): # data exist - DatabaseSchemaUpdater().update_to_latest() -else: - Base.metadata.create_all(engine) - DatabaseSchemaUpdater().set_schema_version(DatabaseSchemaUpdater.LATEST) diff --git a/src/flickrhistory/database/photo_saver.py b/src/flickrhistory/database/photo_saver.py index c30132c..15fce83 100644 --- a/src/flickrhistory/database/photo_saver.py +++ b/src/flickrhistory/database/photo_saver.py @@ -8,7 +8,7 @@ import datetime from .models import License, Photo, Tag -from .engine import Session +from .session import Session from .user_saver import UserSaver diff --git a/src/flickrhistory/database/session.py b/src/flickrhistory/database/session.py new file mode 100644 index 0000000..93acd50 --- /dev/null +++ b/src/flickrhistory/database/session.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + + +"""An SQLAlchemy sessionmaker.""" + + +__all__ = ["Session"] + + +import multiprocessing + +import sqlalchemy +import sqlalchemy.orm + +from ..config import Config +from .databaseschemaupdater import DatabaseSchemaUpdater +from .models import Photo +from .models.base import Base + + +POOL_SIZE = multiprocessing.cpu_count() * 10 + + +class Session: + """An sqlachemy.Session.""" + + _sessionmaker = None + + def __new__(cls, *args, **kwargs): + """Return an sqlachemy.Session.""" + if cls._sessionmaker is None: + with Config() as config: + engine = sqlalchemy.create_engine( + config["database_connection_string"], + pool_size=POOL_SIZE, + max_overflow=POOL_SIZE, + ) + + with engine.begin() as connection: + connection.execute( + sqlalchemy.text( + """ + CREATE EXTENSION IF NOT EXISTS + postgis; + """ + ) + ) + + if sqlalchemy.inspect(engine).has_table(Photo.__table__.name): # data exist + DatabaseSchemaUpdater().update_to_latest() + else: + Base.metadata.create_all(engine) + DatabaseSchemaUpdater().set_schema_version(DatabaseSchemaUpdater.LATEST) + + cls._sessionmaker = sqlalchemy.orm.sessionmaker(engine, autoflush=False) + return cls._sessionmaker() diff --git a/src/flickrhistory/database/user_saver.py b/src/flickrhistory/database/user_saver.py index fe8d1ca..cd90d4a 100644 --- a/src/flickrhistory/database/user_saver.py +++ b/src/flickrhistory/database/user_saver.py @@ -8,7 +8,7 @@ import datetime from .models import User -from .engine import Session +from .session import Session __all__ = ["UserSaver"]