pydbkit/tools/schemadiff.py
changeset 104 d8ff52a0390f
parent 101 2a2d0d5df03b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pydbkit/tools/schemadiff.py	Wed Jul 09 18:03:54 2014 +0200
@@ -0,0 +1,51 @@
+from pydbkit.toolbase import SrcDstTool
+from pydbkit import pgmanager, pgbrowser, pgdiff, toolbase
+
+
+class SchemaDiffTool(SrcDstTool):
+
+    """
+    Print differences in database schema.
+
+    Prints changes from source to destination.
+    SQL patch updates source database schema to destination schema.
+
+    """
+
+    def __init__(self):
+        SrcDstTool.__init__(self, name='schemadiff', allow_reverse=True)
+
+    def specify_args(self):
+        SrcDstTool.specify_args(self)
+        self.parser.add_argument('-s', dest='schema', nargs='*', help='Schema filter')
+        self.parser.add_argument('-t', dest='table', nargs='*', help='Table filter')
+        self.parser.add_argument('-f', dest='function', type=str, help='Function filter (regex)')
+        self.parser.add_argument('--sql', action='store_true', help='Output is SQL script.')
+        self.parser.add_argument('--body', action='store_true', help='Output diff for function bodies.')
+
+    def main(self):
+        srcbrowser = pgbrowser.PgBrowser(self.pgm.get_conn('src'))
+        dstbrowser = pgbrowser.PgBrowser(self.pgm.get_conn('dst'))
+
+        pgd = pgdiff.PgDiff(srcbrowser, dstbrowser)
+
+        try:
+            if self.args.schema:
+                pgd.filter_schemas(include=self.args.schema)
+            if self.args.table:
+                pgd.filter_tables(include=self.args.table)
+            if self.args.function:
+                pgd.filter_functions(self.args.function)
+            if self.args.body:
+                pgd.function_body_diff = True
+
+            if self.args.sql:
+                pgd.print_patch()
+            else:
+                pgd.print_diff()
+        except pgdiff.PgDiffError as e:
+            print('PgDiff error:', str(e))
+
+
+cls = SchemaDiffTool
+