-
Notifications
You must be signed in to change notification settings - Fork 1.5k
/
datastore.py
65 lines (50 loc) · 1.99 KB
/
datastore.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
"""
Use the built-in sqlite3 library as a datastore,
To handle database migrations, use the `yoyo-migrations` package.
For further details on this, see:
https://pypi.python.org/pypi/yoyo-migrations
"""
import inspect
import os
import sys
import warnings
try:
from yoyo import read_migrations, get_backend
except ImportError:
warnings.warn('Please run `pip install -r requirements.txt` to ensure you have the latest required packages')
sys.exit(-1)
_DEFAULT = object()
BACKEND = _DEFAULT
DATABASE = _DEFAULT
def _init_database(connection_string=':memory:', driver='sqlite'):
global BACKEND, DATABASE
if DATABASE is _DEFAULT:
BACKEND = get_backend('{driver}://{conn}'.format(driver=driver, conn=connection_string))
DATABASE = BACKEND.connection
return DATABASE
class Datastore(object):
MIGRATIONS_PATH = _DEFAULT
def __init__(self, *args, **kwargs):
"""
When a subclass is initiated, the migrations should automatically be run.
"""
if _DEFAULT in (BACKEND, DATABASE):
raise RuntimeError('Migration database connection not setup. Need to run `_init_database`')
# Init parents with additional params we may have received
super(Datastore, self).__init__(*args, **kwargs)
path = self.MIGRATIONS_PATH
if path is _DEFAULT:
# `migrations` should be a sub directory of the calling package, unless a path is specified
filename = inspect.stack()[1][1]
path = os.path.join(os.path.dirname(filename), 'migrations')
elif not os.path.isdir(str(path)):
raise RuntimeError('The migrations directory does not exist')
try:
migrations = read_migrations(path)
BACKEND.apply_migrations(BACKEND.to_apply(migrations))
except (IOError, OSError):
"""
If `migrations` directory is not present, then whatever is subclassing
us will not have any DB schemas to load.
"""
pass