Re: CLI for Schema Diff - Mailing list pgadmin-hackers

From Steve Chavez
Subject Re: CLI for Schema Diff
Date
Msg-id CAGRrpzaD-8WDwRQEXOsDO+_xpVBr0F2R8zgMwYzz2jcLCrT1_A@mail.gmail.com
Whole thread Raw
In response to Re: CLI for Schema Diff  (Dave Page <dpage@pgadmin.org>)
List pgadmin-hackers
Hi Dave,

Thanks for the thoughtful reply. I got sidetracked but now I'm able to continue work on the CLI.

> 1) Agree a standard for command line syntax.
> 3) Make the code modular and extensible; perhaps using a Python module per CLI module.

Cool, I agree with the standard. From my understanding, the "core" CLI module would be in charge of registering the servers, and thus it'll be needed by all the other CLI modules right?

Regarding the grant wizard, I'm not familiar with the module so I can't be of much help in implementing a CLI mode for it.

However, I can definitely help with both core and schema diff. Would you agree if I scope my contribution to only those 2 modules?

> 2) Figure out how to avoid the hacks in your existing code to do things like:

Absolutely. I've been meaning to speed up the CLI start-up time, my implementation currently loads many unneeded modules. I'll also avoid the hack to hide stdout.

> 4) Allow the use of saved connections as well as arbitrary connection strings.

Agree. I think saved connections will come with the "core" CLI module implementation(the register-server command).

On Thu, 1 Apr 2021 at 03:44, Dave Page <dpage@pgadmin.org> wrote:
Hi

On Thu, Apr 1, 2021 at 12:38 AM Steve Chavez <steve@supabase.io> wrote:
> but is this something you'd be interested in working on to become a more fully featured and production quality CLI? 

Yes, absolutely!

Cool!
 
What would be the next step? I'm all for doing a CLI that covers pgAdmin quality standards.

I think there are a few things we'd need to do:

1) Agree a standard for command line syntax. CLIs can easily become very messy - I've spent time designing such standards in the past (unfortunately, I can't just share that), but some thoughts might be:

  - have a consistent <command> <command options> <module> <action> <action options> syntax. For example;

        pgacli --output-format=json schema-diff generate-diff --source=... --target=...
        pgacli core register-server --host=... --maintenance-db=... ...
        pgacli grant-wizard grant-acl --select --type=tables --objects=schema.tb_*

    (I've assumed a module name of 'core' for things directly related to the heart of pgAdmin)

    - Actions are in the form "verb-noun"
    - Every common option has both a short and a long form
    - Uncommon options have a long form only
    - Support various help options, showing appropriate info;

    pgacli -h
    pgacli --help
    pgacli core -h
    pgacli schema-diff --help

2) Figure out how to avoid the hacks in your existing code to do things like:

    - Hide initialisation output
    - Setup the dummy SQLite database

3) Make the code modular and extensible; perhaps using a Python module per CLI module.

4) Allow the use of saved connections as well as arbitrary connection strings.

I think 2 is the hardest issue. It may be that we add a flag to the main application code that tells it it's running under the CLI, so that it can avoid doing things it doesn't need to in those cases. One example is the module loading; we might want to skip that entirely under the CLI, and have the CLI module that's being called load just the modules it needs.
 

On Wed, 31 Mar 2021 at 03:08, Dave Page <dpage@pgadmin.org> wrote:
Hi

On Tue, Mar 30, 2021 at 3:36 PM Steve Chavez <steve@supabase.io> wrote:
Hey all,

In case anyone is interested, I've managed to enable a CLI mode for the Schema Diff on this repo:


It basically works by using a Flask test client that interacts with the Schema Diff endpoints.
It's a single isolated file, I haven't patched any of the existing modules.

For a quickstart, there's also a docker image that can be used like:

docker run supabase/pgadmin-schema-diff \
'postgres://postgres@host/diff_source' \
'postgres://postgres@host/diff_target' \
> diff.sql ## the stderr output shows the same messages as the Schema Diff GUI:
Starting schema diff...
Comparision started......0%
Comparing FTS Dictionaries ...35%
Comparing Functions ...50%
Comparing Trigger Functions ...60%
Comparing Sequences ...70%
Comparing Tables ...80%
Comparing Views ...90%
Done.

That's an interesting approach! Obviously the code is just a proof of concept at the moment (redirecting stdout is masking errors for example), but is this something you'd be interested in working on to become a more fully featured and production quality CLI? 

--
Dave Page
Blog: http://pgsnake.blogspot.com
Twitter: @pgsnake

EDB: http://www.enterprisedb.com



--
Dave Page
Blog: http://pgsnake.blogspot.com
Twitter: @pgsnake

EDB: http://www.enterprisedb.com

pgadmin-hackers by date:

Previous
From: Akshay Joshi
Date:
Subject: Re: Translators: Release next week
Next
From: Dave Page
Date:
Subject: Re: CLI for Schema Diff