Odyssey
db.py
1 """
2 DB migrations
3 """
4 
5 import argparse
6 import os
7 import shellish
8 import subprocess
9 import psycopg2
10 from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT
11 
12 
13 class DB(shellish.Command):
14  """ Perform DB management. """
15 
16  name = 'db'
17 
18  def setup_args(self, parser):
19  self.add_subcommand(Create)
20  self.add_subcommand(Remove)
21  self.add_subcommand(Migrate)
22  self.add_subcommand(Rollback)
23  self.add_subcommand(Status)
24 
25 
26 class DBCommand(shellish.Command):
27 
28  def setup_args(self, parser):
29  self.add_argument('--host', env='DATABASE_HOST',
30  help="Database server host or IP.")
31  self.add_argument('--port', type=int, env='DATABASE_PORT',
32  help="Database server port.")
33  self.add_argument('--user', env='DATABASE_USER',
34  help="Database username.")
35  self.add_argument('--password', env='DATABASE_PASSWORD',
36  help="Database password.")
37  self.add_argument('--dbname', env='DATABASE_NAME',
38  help="Database name to create.")
39 
40  def sqlexec(self, args, statement):
41  with psycopg2.connect(host=args.host, port=args.port, user=args.user,
42  password=args.password, dbname='postgres') as db:
43  db.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)
44  with db.cursor() as c:
45  c.execute(statement)
46 
47 
49  """ Create a new database for this stack. """
50 
51  name = 'create'
52 
53  def run(self, args):
54  raise ValueError("DEPRECATED COMMAND")
55  shellish.vtmlprint("<b>Creating database:</b> <blue>%s</blue>" %
56  args.dbname)
57  try:
58  self.sqlexec(args, 'CREATE DATABASE %s;' % args.dbname)
59  except psycopg2.ProgrammingError as e:
60  if 'already exists' in str(e):
61  shellish.vtmlprint("<b>WARNING:</b> <yellow>Database already exists")
62  else:
63  raise e
64 
65 
67  """ Create a new database for this stack. """
68 
69  name = 'rm'
70 
71  def setup_args(self, parser):
72  super().setup_args(parser)
73  self.add_argument('--force', '-f', action='store_true',
74  help="Do not prompt for removal")
75 
76  def run(self, args):
77  raise ValueError("DEPRECATED COMMAND")
78  if not args.force:
79  confirm = input("Type name of db (%s) to confirm removal: " %
80  args.dbname)
81  if confirm != args.dbname:
82  raise SystemExit("Aborted database removal")
83  shellish.vtmlprint("<b>WARNING:</b> <red>Removing database <b>%s</b>"
84  % args.dbname)
85  self.sqlexec(args, 'DROP DATABASE %s;' % args.dbname)
86 
87 
88 class PhinxCommand(shellish.Command):
89 
90  phinx_command = None
91 
92  def setup_args(self, parser):
93  self.add_argument('args', nargs=argparse.REMAINDER,
94  help='Args for phinx command.')
95 
96  def run(self, args):
97  cmd = [
98  '%s/bin/phinx' % os.environ['COMPOSER_VENDOR_DIR'],
99  self.phinx_command
100  ]
101  cmd.extend(args.args)
102  raise SystemExit(subprocess.call(cmd, cwd='/db'))
103 
104 
106  """ Perform DB migrations with Phinx. """
107 
108  name = 'migrate'
109  phinx_command = 'migrate'
110 
112  """ Perform DB migrations with Phinx. """
113 
114  name = 'rollback'
115  phinx_command = 'rollback'
116 
117 
119  """ Show DB schema status from Phinx. """
120 
121  name = 'status'
122  phinx_command = 'status'
Definition: db.py:13
def sqlexec(self, args, statement)
Definition: db.py:40