| 
2
 | 
     1  | 
#!/usr/bin/env python3.2
  | 
| 
 | 
     2  | 
  | 
| 
 | 
     3  | 
import sys
  | 
| 
 | 
     4  | 
import argparse
  | 
| 
 | 
     5  | 
  | 
| 
 | 
     6  | 
from pgtools import pgmanager, pgbrowser, pgdiff
  | 
| 
 | 
     7  | 
from common import config
  | 
| 
 | 
     8  | 
  | 
| 
 | 
     9  | 
parser = argparse.ArgumentParser(description='Database schema diff.')
  | 
| 
 | 
    10  | 
parser.add_argument('source', metavar='source', type=str, help='Source database')
 | 
| 
 | 
    11  | 
parser.add_argument('destination', metavar='destination', type=str, help='Destination database')
 | 
| 
 | 
    12  | 
parser.add_argument('-s', dest='schema', nargs='*', help='Schema filter')
 | 
| 
 | 
    13  | 
parser.add_argument('-t', dest='table', nargs='*', help='Table filter')
 | 
| 
 | 
    14  | 
args = parser.parse_args()
  | 
| 
 | 
    15  | 
  | 
| 
 | 
    16  | 
config = config.ConfigParser()
  | 
| 
 | 
    17  | 
config.add_argument('databases', type=dict)
 | 
| 
 | 
    18  | 
config.add_argument('meta_db')
 | 
| 
 | 
    19  | 
config.add_argument('meta_query')
 | 
| 
 | 
    20  | 
config.load('pgtoolkit.conf')
 | 
| 
 | 
    21  | 
  | 
| 
 | 
    22  | 
pgm = pgmanager.get_instance()
  | 
| 
 | 
    23  | 
  | 
| 
 | 
    24  | 
pgm.create_conn(name='meta', dns=config.meta_db)
  | 
| 
 | 
    25  | 
  | 
| 
 | 
    26  | 
def build_conn(name, targetname):
  | 
| 
 | 
    27  | 
    with pgm.cursor('meta') as curs:
 | 
| 
 | 
    28  | 
        curs.execute(config.meta_query, [targetname])
  | 
| 
 | 
    29  | 
        row = curs.fetchone_dict()
  | 
| 
 | 
    30  | 
        curs.connection.commit()
  | 
| 
 | 
    31  | 
        
  | 
| 
 | 
    32  | 
        pgm.create_conn(name=name, **row)
  | 
| 
 | 
    33  | 
  | 
| 
 | 
    34  | 
build_conn('src', args.source)
 | 
| 
 | 
    35  | 
build_conn('dst', args.destination)
 | 
| 
 | 
    36  | 
  | 
| 
 | 
    37  | 
pgm.close_conn('meta')
 | 
| 
 | 
    38  | 
  | 
| 
 | 
    39  | 
srcbrowser = pgbrowser.PgBrowser(pgm.get_conn('src'))
 | 
| 
 | 
    40  | 
dstbrowser = pgbrowser.PgBrowser(pgm.get_conn('dst'))
 | 
| 
 | 
    41  | 
  | 
| 
 | 
    42  | 
pgd = pgdiff.PgDiff(srcbrowser, dstbrowser)
  | 
| 
 | 
    43  | 
  | 
| 
 | 
    44  | 
if args.schema:
  | 
| 
 | 
    45  | 
    pgd.filter_schemas(include=args.schema)
  | 
| 
 | 
    46  | 
  | 
| 
 | 
    47  | 
if args.table:
  | 
| 
 | 
    48  | 
    pgd.filter_tables(include=args.table)
  | 
| 
 | 
    49  | 
  | 
| 
 | 
    50  | 
pgd.print_diff()
  |