On Fri, Aug 25, 2017 at 9:28 AM, Harshal Dhumal < harshal.dhu...@enterprisedb.com> wrote:
> One more thing that this will only work for future pgAdmin4 versions > Yeah :-( > > -- > *Harshal Dhumal* > *Sr. Software Engineer* > > EnterpriseDB India: http://www.enterprisedb.com > The Enterprise PostgreSQL Company > > On Fri, Aug 25, 2017 at 1:48 PM, Dave Page <dp...@pgadmin.org> wrote: > >> >> >> On Fri, Aug 25, 2017 at 9:15 AM, Surinder Kumar < >> surinder.ku...@enterprisedb.com> wrote: >> >>> Hi >>> >>> On Fri, Aug 25, 2017 at 12:21 PM, Ashesh Vashi < >>> ashesh.va...@enterprisedb.com> wrote: >>> >>>> On Fri, Aug 25, 2017 at 12:16 PM, Surinder Kumar < >>>> surinder.ku...@enterprisedb.com> wrote: >>>> >>>>> Hi >>>>> On Fri, Aug 25, 2017 at 1:03 AM, Dave Page <dp...@pgadmin.org> wrote: >>>>> >>>>>> >>>>>> >>>>>> On Thu, Aug 24, 2017 at 8:28 PM, Harshal Dhumal < >>>>>> harshal.dhu...@enterprisedb.com> wrote: >>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> *Harshal Dhumal* >>>>>>> *Sr. Software Engineer* >>>>>>> >>>>>>> EnterpriseDB India: http://www.enterprisedb.com >>>>>>> The Enterprise PostgreSQL Company >>>>>>> >>>>>>> On Thu, Aug 24, 2017 at 9:44 PM, Dave Page <dp...@pgadmin.org> >>>>>>> wrote: >>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> On Thu, Aug 24, 2017 at 10:36 AM, Surinder Kumar < >>>>>>>> surinder.ku...@enterprisedb.com> wrote: >>>>>>>> >>>>>>>>> Hi Dave, >>>>>>>>> >>>>>>>>> On Thu, Aug 24, 2017 at 2:28 PM, Dave Page <dp...@pgadmin.org> >>>>>>>>> wrote: >>>>>>>>> >>>>>>>>>> Anyone object to doing a release on 14th September, wrapping the >>>>>>>>>> code on Monday 11th? This seems like the best option for our QA >>>>>>>>>> folks who >>>>>>>>>> will be off for EID somewhen in the two weeks before. >>>>>>>>>> >>>>>>>>>> Assuming not, should this be 1.7 or 2.0? >>>>>>>>>> >>>>>>>>>> If we go with 2.0, it'll be for "safety" given the proposed >>>>>>>>>> changes to path management to allow both server and desktop modes to >>>>>>>>>> work >>>>>>>>>> out of the box on Linux. >>>>>>>>>> >>>>>>>>>> If we do that, we also need to ensure that any changes to the >>>>>>>>>> config database are backwards compatible, as a 2.0 release would be a >>>>>>>>>> side-by-side installation. Surinder; was it you that had looked into >>>>>>>>>> that? >>>>>>>>>> >>>>>>>>> I had looked into this and here are my findings: >>>>>>>>> 1. If we are using newer version of pgAdmin and the go back to >>>>>>>>> older version of pgAdmin, then on running `python pgAdmin4.py`. the >>>>>>>>> flask-migrate(Alembic) try to perform downgrade by one step only(ie. >>>>>>>>> it can >>>>>>>>> switch back to one migration only when we run `python pgAdmin4.py`). >>>>>>>>> But >>>>>>>>> we have multiple database revisions to be migrated. So migration >>>>>>>>> fails here. >>>>>>>>> >>>>>>>>> 2. When Alebmic downgrade is performed by one step, it looks for >>>>>>>>> downgrade function in that specific database revision, but in our >>>>>>>>> code we >>>>>>>>> didn't written downgrade function. But if we have written downgrade >>>>>>>>> statement, still there is an issue: >>>>>>>>> ie. If we add a new column to a table xyz using ALTER statement >>>>>>>>> like: >>>>>>>>> >>>>>>>>> ``` >>>>>>>>> >>>>>>>>> def upgrade(): >>>>>>>>> >>>>>>>>> verison = get_version() >>>>>>>>> >>>>>>>>> >>>>>>>>> db.engine.execute( >>>>>>>>> >>>>>>>>> 'ALTER TABLE server ADD COLUMN hostaddr TEXT(1024)' >>>>>>>>> >>>>>>>>> ) >>>>>>>>> >>>>>>>>> def downgrade(): >>>>>>>>> >>>>>>>>> pass >>>>>>>>> ``` >>>>>>>>> then on downgrade it executes `downgrade` method, so downgrade >>>>>>>>> should have code like >>>>>>>>> `ALTER TABLE server DROP COLUMN hostaddr ` >>>>>>>>> but in sqlite DROP COLUMN statements don't work. >>>>>>>>> So, this is a an issue with Sqlite database. However, an >>>>>>>>> alternative way is also given. Here is link >>>>>>>>> <https://stackoverflow.com/questions/5938048/delete-column-from-sqlite-table> >>>>>>>>> >>>>>>>>> >>>>>>>>> Still, I didn't find any other solution on upgrading/downgrading >>>>>>>>> database revisions without errors. >>>>>>>>> It is an issue with Flask-Migrate(Alembic) plugin. >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> Urgh. So I guess the other option is that we version the DB >>>>>>>> filename as well. The downside of that is that users will want to >>>>>>>> migrate >>>>>>>> their settings - which may be awkward as we'll have no real way of >>>>>>>> knowing >>>>>>>> where they are. >>>>>>>> >>>>>>>> Thoughts? >>>>>>>> >>>>>>>> Or should we write our own custom backword migrations? For eg. >>>>>>> dropping column can be achieved by creating another table excluding the >>>>>>> columns which we want to drop then copy data to new table and then drop >>>>>>> old >>>>>>> table and rename new table to old name. And also sqlite database schema >>>>>>> which we have in pgAdmin4 is small so writing and maintaining custom >>>>>>> migration won be that hard. >>>>>>> >>>>>> >>>>>> The problem is that we don't want to migrate backwards; we want both >>>>>> versions to be able to run with the same database (for example, because >>>>>> you >>>>>> might have multiple versions installed with the EDB PG installer as I do >>>>>> on >>>>>> my laptop). >>>>>> >>>>>> Previously, we always made sure our changes were backwards compatible >>>>>> (e.g. by only adding new columns, never removing or renaming them), and >>>>>> our >>>>>> home-grown migration code only cared about upgrading the database to the >>>>>> current version; it wouldn't complain if the database was of a newer >>>>>> version. >>>>>> >>>>> The code which is responsible to run database migration is >>>>> `db_upgrade(app)` in `pgadmin/__init__.py` it executes when python server >>>>> runs `python pgAdmin4.py`, It fails with older version of pgAdmin4(say >>>>> 1.5) >>>>> because it cannot find db revision file (revision id stored in table >>>>> 'alembic_version') in `web/migrations` folder of latest pgAdmin4-1.5 >>>>> >>>>> But If we catch this exception like: >>>>> ``` >>>>> import alembic >>>>> try: >>>>> db_upgrade(app) >>>>> except alembic.util.exc.CommandError as e: # Handle migration >>>>> error, I expect this exception will be raised in older version of code. >>>>> app.logger.info('Failed to run migrations: %s' % str(e)) >>>>> ``` >>>>> >>>>> It will fail to run migrations but exception will be handled and >>>>> python app server will be started successfully and pgAdmin4 will run with >>>>> newer database. >>>>> Or, we should check whether the migration which is about to run >>>>> against the revision id(stored in table alembic_version) exists or not in >>>>> `web/migrations`. >>>>> If it exists then run migration otherwise don't run. >>>>> >>>>> This way the same database will work for pgAdmin4-1.5 and pgAdmin4-1.6 >>>>> But the only problem is that we didn't caught exception >>>>> `alembic.util.exc.CommandError` in older versions of pgAdmin4. >>>>> >>>> As per my understanding, that's not safe, as we may not be able to >>>> catch some other genuine issues. >>>> >>> Yes, that's the possibility. >>> I discussed this with Harshal and discussed about what other possible >>> workarounds can work. >>> So, here is the one: >>> >>> We will store the current pgAdmin4 version in sqlite table if we are not >>> storing. Also, current pgAdmin4 version is assigned to config variable >>> `APP_VERSION` in config.py >>> >>> And when running older pgAdmin4 version with new database, >>> we will compare `if config. >>> APP_VERSION >>> < PGADMIN4_VERSION`, then skip migration, otherwise run. >>> *For example:* >>> >>> if config. >>> APP_VERSION >>> >= PGADMIN4_VERSION: # Run migration only when >>> >>> db_upgrade(app) # run migration >>> # Now update PGADMIN4_VERSION in sqlite to latest one >>> >> >> That sounds like a reasonable approach, though for developers I think the >> pgAdmin version wouldn't necessarily work - we'd need a schema version like >> we used to have. >> >> -- >> Dave Page >> Blog: http://pgsnake.blogspot.com >> Twitter: @pgsnake >> >> EnterpriseDB UK: http://www.enterprisedb.com >> The Enterprise PostgreSQL Company >> > > -- Dave Page Blog: http://pgsnake.blogspot.com Twitter: @pgsnake EnterpriseDB UK: http://www.enterprisedb.com The Enterprise PostgreSQL Company