示例#1
0
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
示例#2
0
 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
示例#4
0
文件: migra.py 项目: djrobstep/migra
 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)
示例#5
0
    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)
示例#6
0
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
示例#8
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 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
示例#10
0
 def raw(self, sql):
     with S(*self._args, **self._kwargs) as s:
         _results = raw_execute(s, sql)
         return _results
示例#11
0
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