def test_migration(shelf_filename, cld_host, dbexport_host, username, password, service_binding): PENDING = sql_from_folder(PENDING_FOLDER) with tempfolder() as tempf: outfile = os.path.join(tempf, 'schemadump.sql') do_schema_dump(outfile, cld_host, dbexport_host, username, password, service_binding) for i in range(len(PENDING) + 1): ATTEMPTING = list(reversed(PENDING))[:i] ATTEMPTING.reverse() print("TESTING MIGRATION USING LAST {} MIGRATION FILES".format(i)) with temporary_db() as dummy_db_url, temporary_db() as target_db_url: with S(dummy_db_url) as s_dummy: load_sql_from_file(s_dummy, outfile) try: for migration_sql in ATTEMPTING: raw_execute(s_dummy, migration_sql) except DB_ERROR_TUPLE: print('TRIED USING LAST {} PENDING FILES TO MIGRATE BUT THIS FAILED, MOVING TO NEXT'.format(i)) continue load_from_app_model(target_db_url) if databases_are_equal(dummy_db_url, target_db_url): print('SUCCESS WITH LAST {} PENDING FILES'.format(i)) shelve_result(shelf_filename, ATTEMPTING) return 0 else: print('TRIED USING LAST {} PENDING FILES TO MIGRATE BUT THIS DOES NOT GIVE A CORRECT OUTCOME, MOVING TO NEXT'.format(i)) print('COULD NOT FIND A CORRECT MIGRATION PATH :(') return 1
def apply(self): for stmt in self.statements: raw_execute(self.s_from, stmt) self.changes.i_from = get_inspector(self.s_from, schema=self.schema) safety_on = self.statements.safe self.clear() self.set_safety(safety_on)
def test_migration(shelf_filename, cld_host, dbexport_host, username, password, service_binding): PENDING = sql_from_folder(PENDING_FOLDER) with tempfolder() as tempf: outfile = os.path.join(tempf, 'schemadump.sql') do_schema_dump(outfile, cld_host, dbexport_host, username, password, service_binding) for i in range(len(PENDING) + 1): ATTEMPTING = list(reversed(PENDING))[:i] ATTEMPTING.reverse() print("TESTING MIGRATION USING LAST {} MIGRATION FILES".format(i)) with temporary_db() as dummy_db_url, temporary_db() as target_db_url: with S(dummy_db_url) as s_dummy: load_sql_from_file(s_dummy, outfile) try: for migration_sql in ATTEMPTING: raw_execute(s_dummy, migration_sql) except DB_ERROR_TUPLE: print('TRIED USING LAST {} PENDING FILES TO MIGRATE BUT THIS FAILED, MOVING TO NEXT'.format(i)) continue load_from_app_model(target_db_url) if databases_are_equal(dummy_db_url, target_db_url): print('SUCCESS WITH LAST {} PENDING FILES'.format(i)) shelve_result(shelf_filename, ATTEMPTING) return 0 else: print('TRIED USING LAST {} PENDING FILES TO MIGRATE BUT THIS DOES NOT GIVE A CORRECT OUTCOME, MOVING TO NEXT'.format(i)) print('COULD NOT FIND A CORRECT MIGRATION PATH :(') return 1
def apply(self): for stmt in self.statements: raw_execute(self.s_from, stmt) self.changes.i_from = get_inspector(self.s_from, schema=self.schema) safety_on = self.statements.safe self.clear() self.set_safety(safety_on)
def apply(self): for stmt in self.statements: raw_execute(self.s_from, stmt) self.inspect_from() safety_on = self.statements.safe self.clear() self.set_safety(safety_on)
def do_migration(REAL_DB_URL): PENDING = sql_from_folder(PENDING_FOLDER) with tempfolder() as tempf: outfile = os.path.join(tempf, 'schemadump.sql') do_schema_dump(REAL_DB_URL, outfile) for i in range(len(PENDING) + 1): ATTEMPTING = list(reversed(PENDING))[:i] ATTEMPTING.reverse() print("TESTING MIGRATION USING LAST {} MIGRATION FILES".format(i)) with temporary_db() as dummy_db_url, temporary_db( ) as target_db_url: with S(dummy_db_url) as s_dummy: load_sql_from_file(s_dummy, outfile) try: for migration_sql in ATTEMPTING: raw_execute(s_dummy, migration_sql) except DB_ERROR_TUPLE as e: print( 'TRIED USING LAST {} PENDING FILES TO MIGRATE BUT THIS FAILED, MOVING TO NEXT' .format(i)) continue load_from_app_model(target_db_url) if databases_are_equal(dummy_db_url, target_db_url): print('APPLYING LAST {} PENDING FILES'.format(i)) with S(REAL_DB_URL) as s_real: for migration_sql in ATTEMPTING: if not DRY_RUN: print("EXECUTING:") print(migration_sql) raw_execute(s_real, migration_sql) else: print('DRY RUN, would apply:') print(migration_sql) print('SUCCESS: DATABASE UP TO DATE.') return 0 else: print( 'TRIED USING LAST {} PENDING FILES TO MIGRATE BUT THIS DOES NOT GIVE A CORRECT OUTCOME, MOVING TO NEXT' .format(i)) print('COULD NOT FIND A CORRECT MIGRATION PATH :(') return 1
def do_migration(REAL_DB_URL): PENDING = sql_from_folder(PENDING_FOLDER) with tempfolder() as tempf: outfile = os.path.join(tempf, 'schemadump.sql') do_schema_dump(REAL_DB_URL, outfile) for i in range(len(PENDING) + 1): ATTEMPTING = list(reversed(PENDING))[:i] ATTEMPTING.reverse() print("TESTING MIGRATION USING LAST {} MIGRATION FILES".format(i)) with temporary_db() as dummy_db_url, temporary_db() as target_db_url: with S(dummy_db_url) as s_dummy: load_sql_from_file(s_dummy, outfile) try: for migration_sql in ATTEMPTING: raw_execute(s_dummy, migration_sql) except DB_ERROR_TUPLE as e: print('TRIED USING LAST {} PENDING FILES TO MIGRATE BUT THIS FAILED, MOVING TO NEXT'.format(i)) continue load_from_app_model(target_db_url) if databases_are_equal(dummy_db_url, target_db_url): print('APPLYING LAST {} PENDING FILES'.format(i)) with S(REAL_DB_URL) as s_real: for migration_sql in ATTEMPTING: if not DRY_RUN: print("EXECUTING:") print(migration_sql) raw_execute(s_real, migration_sql) else: print('DRY RUN, would apply:') print(migration_sql) print('SUCCESS: DATABASE UP TO DATE.') return 0 else: print('TRIED USING LAST {} PENDING FILES TO MIGRATE BUT THIS DOES NOT GIVE A CORRECT OUTCOME, MOVING TO NEXT'.format(i)) print('COULD NOT FIND A CORRECT MIGRATION PATH :(') return 1
def do_migration(shelf_filename): REAL_DB_URL = os.environ['DATABASE_URL'].replace('reconnect=true', '') ATTEMPTING = get_shelved_result(shelf_filename) print('APPLYING PENDING FILE') with S(REAL_DB_URL) as s_real: for migration_sql in ATTEMPTING: if not DRY_RUN: print("EXECUTING:") print(migration_sql) raw_execute(s_real, migration_sql) else: print('DRY RUN, would apply:') print(migration_sql) print('SUCCESS: DATABASE UP TO DATE.') return 0
def do_migration(shelf_filename): REAL_DB_URL = os.environ['DATABASE_URL'].replace('reconnect=true', '') ATTEMPTING = get_shelved_result(shelf_filename) print('APPLYING PENDING FILE') with S(REAL_DB_URL) as s_real: for migration_sql in ATTEMPTING: if not DRY_RUN: print("EXECUTING:") print(migration_sql) raw_execute(s_real, migration_sql) else: print('DRY RUN, would apply:') print(migration_sql) print('SUCCESS: DATABASE UP TO DATE.') return 0
def raw(self, sql): with S(*self._args, **self._kwargs) as s: _results = raw_execute(s, sql) return _results
def diff( sql_statements: str, db: str, unsafe: bool = False, apply: bool = False, chatty: bool = False, ): base_uri = copy_url(db) patch = create_admin_patch(base_uri) patch.start() roles, statements = extract_roles(sql_statements) with temporary_database(base_uri) as sTemp: roles_m = Migration(sTemp, NullInspector()) from_roles = roles_m.changes.i_from.roles # Exclude all unspecified roles for k in set(from_roles.keys()) - set(roles.keys()): del from_roles[k] # Compare roles roles_m.add(statements_for_changes(from_roles, roles)) if roles_m.statements: roles_m.set_safety(True) roles_sql = roles_m.sql if chatty: print(pg_format(roles_sql.encode(), unquote=False).decode()) print(cf.bold("Applying roles...")) roles_m.apply() sTemp.commit() if chatty: print(cf.bold("Done.")) target_exists = database_exists(base_uri, test_can_select=True) with S(db) if target_exists else temporary_database(base_uri) as sFrom: # Run schema in temporary database try: raw_execute(sTemp, statements) except Exception as e: raise SQLSyntaxError(e, statements) # Compare m = Migration(sFrom, sTemp) m.set_safety(not unsafe) m.add_all_changes(privileges=True) if not m.statements: if chatty: print(cf.bold("All done! ✨")) print(f'Database "{base_uri.database}" is up to date.') return None, False sql = "" # Get SQL try: sql = m.sql except UnsafeMigrationException: m.set_safety(False) sql = m.sql formatted = pg_format(sql.encode(), unquote=False).decode() return formatted, True formatted = pg_format(sql.encode(), unquote=False).decode() if chatty: print(formatted) if apply: if chatty: print(cf.bold("Applying...")) m.apply() if chatty: print(cf.bold("All done! ✨")) print(f'Database "{base_uri.database}" has been updated.') return formatted, False