blob: b9435d682032af0a38fa3ef71afd8e1ca4ad40db [file] [log] [blame]
import argparse
import imp
import os.path
import shutil
import sqlite3
import sys
from os import remove
from web_app.app import db
from config import DATABASE_URI, SQLALCHEMY_MIGRATE_REPO, basedir
from migrate.versioning import api
ACTIONS = {}
def action(act):
def wrap(f):
ACTIONS[act] = f
def inner(*args, **kwargs):
return f(*args, **kwargs)
return inner
return wrap
def parse_args(argv):
parser = argparse.ArgumentParser(
description="Manage DB")
parser.add_argument("action",
choices=["dropdb", "createdb", "migrate", "downgrade"])
return parser.parse_args(argv)
@action("createdb")
def createdb():
sqlite3.connect(os.path.join(basedir, 'app.db'))
db.create_all()
if not os.path.exists(SQLALCHEMY_MIGRATE_REPO):
api.create(SQLALCHEMY_MIGRATE_REPO, 'database repository')
api.version_control(DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
else:
api.version_control(DATABASE_URI, SQLALCHEMY_MIGRATE_REPO,
api.version(SQLALCHEMY_MIGRATE_REPO))
@action("dropdb")
def dropdb():
db.create_all()
if os.path.exists(SQLALCHEMY_MIGRATE_REPO):
shutil.rmtree(SQLALCHEMY_MIGRATE_REPO)
db.drop_all()
if os.path.exists(os.path.join(basedir, 'app.db')):
remove(os.path.join(basedir, 'app.db'))
@action("migrate")
def migrate():
v = api.db_version(DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
migration = SQLALCHEMY_MIGRATE_REPO + ('/versions/%03d_migration.py' %
(v+1))
tmp_module = imp.new_module('old_model')
old_model = api.create_model(DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
exec old_model in tmp_module.__dict__
script = api.make_update_script_for_model(DATABASE_URI,
SQLALCHEMY_MIGRATE_REPO,
tmp_module.meta, db.metadata)
open(migration, "wt").write(script)
api.upgrade(DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
v = api.db_version(DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
print('New migration saved as ' + migration)
print('Current database version: ' + str(v))
@action("upgrade")
def upgrade():
api.upgrade(DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
v = api.db_version(DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
print('Current database version: ' + str(v))
@action("downgrade")
def downgrade():
v = api.db_version(DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
api.downgrade(DATABASE_URI, SQLALCHEMY_MIGRATE_REPO, v - 1)
v = api.db_version(DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
print('Current database version: ' + str(v))
def main(argv):
opts = parse_args(argv)
func = ACTIONS.get(opts.action)
func()
if __name__ == '__main__':
exit(main(sys.argv[1:]))