blob: 118fe441e3c1155146819595f13713e151435a47 [file] [log] [blame]
Yulia Portnovac15bfc42015-02-27 18:18:29 +02001import argparse
2import imp
3import os.path
4import shutil
5import sqlite3
6import sys
7
8from os import remove
9
10from web_app.app import db
11from migrate.versioning import api
12
13from config import basedir
14from config import DATABASE_URI
15from config import SQLALCHEMY_MIGRATE_REPO
16
17
18ACTIONS = {}
19
20
21def action(act):
22 def wrap(f):
23 ACTIONS[act] = f
24
25 def inner(*args, **kwargs):
26 return f(*args, **kwargs)
27 return inner
28 return wrap
29
30
31def parse_args(argv):
32 parser = argparse.ArgumentParser(
33 description="Manage DB")
34 parser.add_argument("action",
35 choices=["dropdb", "createdb", "migrate", "downgrade"])
36 return parser.parse_args(argv)
37
38
39@action("createdb")
40def createdb():
41 sqlite3.connect(os.path.join(basedir, 'app.db'))
42
43 db.create_all()
44 if not os.path.exists(SQLALCHEMY_MIGRATE_REPO):
45 api.create(SQLALCHEMY_MIGRATE_REPO, 'database repository')
46 api.version_control(DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
47 else:
48 api.version_control(DATABASE_URI, SQLALCHEMY_MIGRATE_REPO,
49 api.version(SQLALCHEMY_MIGRATE_REPO))
50
51
52@action("dropdb")
53def dropdb():
54 db.create_all()
55 if os.path.exists(SQLALCHEMY_MIGRATE_REPO):
56 shutil.rmtree(SQLALCHEMY_MIGRATE_REPO)
57
58 db.drop_all()
59 if os.path.exists(os.path.join(basedir, 'app.db')):
60 remove(os.path.join(basedir, 'app.db'))
61
62
63@action("migrate")
64def migrate():
65 v = api.db_version(DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
66 migration = SQLALCHEMY_MIGRATE_REPO + ('/versions/%03d_migration.py' %
67 (v+1))
68 tmp_module = imp.new_module('old_model')
69 old_model = api.create_model(DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
70
71 exec old_model in tmp_module.__dict__
72 script = api.make_update_script_for_model(DATABASE_URI,
73 SQLALCHEMY_MIGRATE_REPO,
74 tmp_module.meta, db.metadata)
75 open(migration, "wt").write(script)
76 api.upgrade(DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
77 v = api.db_version(DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
78 print('New migration saved as ' + migration)
79 print('Current database version: ' + str(v))
80
81
82@action("upgrade")
83def upgrade():
84 api.upgrade(DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
85 v = api.db_version(DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
86 print('Current database version: ' + str(v))
87
88
89@action("downgrade")
90def downgrade():
91 v = api.db_version(DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
92 api.downgrade(DATABASE_URI, SQLALCHEMY_MIGRATE_REPO, v - 1)
93 v = api.db_version(DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
94 print('Current database version: ' + str(v))
95
96
97def main(argv):
98 opts = parse_args(argv)
99 func = ACTIONS.get(opts.action)
100 func()
101
102
103if __name__ == '__main__':
104 exit(main(sys.argv[1:]))