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 Thanks, Surinder > -- Thanks, Ashesh > > >> >>> -- >>> Dave Page >>> Blog: http://pgsnake.blogspot.com >>> Twitter: @pgsnake >>> >>> EnterpriseDB UK: http://www.enterprisedb.com >>> The Enterprise PostgreSQL Company >>> >> >> >