Skip to content

Commit 1ad932f

Browse files
Merge pull request #20 from christophfink/side-effects
remove side effect when `import flickrhistory`
2 parents daa862e + 7ff97b8 commit 1ad932f

File tree

8 files changed

+70
-66
lines changed

8 files changed

+70
-66
lines changed

src/flickrhistory/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,4 @@
1515
except ImportError:
1616
pass
1717

18-
__version__ = "0.3.0.dev0"
18+
__version__ = "0.3.0.dev1"

src/flickrhistory/database/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"UserSaver",
1414
]
1515

16-
from .engine import Session
1716
from .models import License, Photo, User
1817
from .photo_saver import PhotoSaver
18+
from .session import Session
1919
from .user_saver import UserSaver

src/flickrhistory/database/databaseschemaupdater.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
import sqlalchemy
1414

15-
from .engine import engine
15+
from ..config import Config
1616

1717

1818
# for now, schema updates are SQL only and work on PostgreSQL, only.
@@ -48,7 +48,9 @@ class DatabaseSchemaUpdater:
4848
def __init__(self):
4949
"""Update the database schema if necessary."""
5050
# Try to create database table for schema version
51-
with engine.begin() as connection:
51+
with Config() as config:
52+
self.engine = sqlalchemy.create_engine(config["database_connection_string"])
53+
with self.engine.begin() as connection:
5254
connection.execute(
5355
sqlalchemy.text(
5456
"""
@@ -65,7 +67,7 @@ def __init__(self):
6567
@property
6668
def installed_version(self):
6769
"""Return current version."""
68-
with engine.connect() as connection:
70+
with self.engine.connect() as connection:
6971
installed_version = connection.execute(
7072
sqlalchemy.text(
7173
"""
@@ -92,18 +94,17 @@ def update_to_latest(self):
9294
file=sys.stderr,
9395
flush=True, # so that we don’t seem without work
9496
)
95-
with engine.begin() as connection:
97+
with self.engine.connect() as connection:
9698
next_version = self.installed_version + 1
9799
connection.execute(sqlalchemy.text(SCHEMA_UPDATES[next_version]))
98100
self.set_schema_version(next_version)
99101
installed_version = self.installed_version
100102

101-
@classmethod
102-
def set_schema_version(cls, version):
103+
def set_schema_version(self, version):
103104
"""Set the schema version (without running update scripts)."""
104-
if version == cls.LATEST:
105+
if version == self.LATEST:
105106
version = max(SCHEMA_UPDATES.keys())
106-
with engine.begin() as connection:
107+
with self.engine.begin() as connection:
107108
connection.execute(
108109
sqlalchemy.text(
109110
"""

src/flickrhistory/database/engine.py

Lines changed: 0 additions & 42 deletions
This file was deleted.

src/flickrhistory/database/models/__init__.py

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,7 @@
1313
]
1414

1515

16-
import sqlalchemy
17-
18-
from ..engine import engine
19-
from .base import Base
20-
from ..databaseschemaupdater import DatabaseSchemaUpdater
2116
from .license import License
2217
from .photo import Photo
2318
from .tag import Tag
2419
from .user import User
25-
26-
27-
if sqlalchemy.inspect(engine).has_table(Photo.__table__.name): # data exist
28-
DatabaseSchemaUpdater().update_to_latest()
29-
else:
30-
Base.metadata.create_all(engine)
31-
DatabaseSchemaUpdater().set_schema_version(DatabaseSchemaUpdater.LATEST)

src/flickrhistory/database/photo_saver.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import datetime
99

1010
from .models import License, Photo, Tag
11-
from .engine import Session
11+
from .session import Session
1212
from .user_saver import UserSaver
1313

1414

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
#!/usr/bin/env python3
2+
# -*- coding: utf-8 -*-
3+
4+
5+
"""An SQLAlchemy sessionmaker."""
6+
7+
8+
__all__ = ["Session"]
9+
10+
11+
import multiprocessing
12+
13+
import sqlalchemy
14+
import sqlalchemy.orm
15+
16+
from ..config import Config
17+
from .databaseschemaupdater import DatabaseSchemaUpdater
18+
from .models import Photo
19+
from .models.base import Base
20+
21+
22+
POOL_SIZE = multiprocessing.cpu_count() * 10
23+
24+
25+
class Session:
26+
"""An sqlachemy.Session."""
27+
28+
_sessionmaker = None
29+
30+
def __new__(cls, *args, **kwargs):
31+
"""Return an sqlachemy.Session."""
32+
if cls._sessionmaker is None:
33+
with Config() as config:
34+
engine = sqlalchemy.create_engine(
35+
config["database_connection_string"],
36+
pool_size=POOL_SIZE,
37+
max_overflow=POOL_SIZE,
38+
)
39+
40+
with engine.begin() as connection:
41+
connection.execute(
42+
sqlalchemy.text(
43+
"""
44+
CREATE EXTENSION IF NOT EXISTS
45+
postgis;
46+
"""
47+
)
48+
)
49+
50+
if sqlalchemy.inspect(engine).has_table(Photo.__table__.name): # data exist
51+
DatabaseSchemaUpdater().update_to_latest()
52+
else:
53+
Base.metadata.create_all(engine)
54+
DatabaseSchemaUpdater().set_schema_version(DatabaseSchemaUpdater.LATEST)
55+
56+
cls._sessionmaker = sqlalchemy.orm.sessionmaker(engine, autoflush=False)
57+
return cls._sessionmaker()

src/flickrhistory/database/user_saver.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import datetime
99

1010
from .models import User
11-
from .engine import Session
11+
from .session import Session
1212

1313

1414
__all__ = ["UserSaver"]

0 commit comments

Comments
 (0)