From bd5b44cbd23c75f5b2d19c9473219c880257b195 Mon Sep 17 00:00:00 2001 From: Jake Moshenko Date: Fri, 1 Apr 2016 13:38:21 -0400 Subject: [PATCH] Move the sequence fixer to a separate tool which can be run --- .../10b999e8db1f_fix_sequences_in_postgres.py | 33 +----------- util/migrate/fixsequences.py | 51 +++++++++++++++++++ 2 files changed, 53 insertions(+), 31 deletions(-) create mode 100644 util/migrate/fixsequences.py diff --git a/data/migrations/versions/10b999e8db1f_fix_sequences_in_postgres.py b/data/migrations/versions/10b999e8db1f_fix_sequences_in_postgres.py index 855afc172..b28ab18b1 100644 --- a/data/migrations/versions/10b999e8db1f_fix_sequences_in_postgres.py +++ b/data/migrations/versions/10b999e8db1f_fix_sequences_in_postgres.py @@ -15,39 +15,10 @@ import sqlalchemy as sa import uuid from peewee import CharField, IntegrityError - +from util.migrate.fixsequences import reset_enum_sequences def upgrade(tables): - from data.database import BaseModel - - class_names = [ - 'TeamRole', - 'LoginService', - 'Visibility', - 'Role', - 'AccessTokenKind', - 'BuildTriggerService', - 'ImageStorageTransformation', - 'ImageStorageSignatureKind', - 'ImageStorageLocation', - 'LogEntryKind', - 'NotificationKind', - 'ExternalNotificationEvent', - 'ExternalNotificationMethod', - ] - - unique_name = '%s' % uuid.uuid4() - - for class_name in class_names: - Model = type(class_name, (BaseModel,), {'name': CharField(index=True)}) - - for _ in xrange(50): - try: - Model.create(name=unique_name).delete_instance() - break - except IntegrityError: - pass - + reset_enum_sequences() def downgrade(tables): pass diff --git a/util/migrate/fixsequences.py b/util/migrate/fixsequences.py new file mode 100644 index 000000000..01fab1cca --- /dev/null +++ b/util/migrate/fixsequences.py @@ -0,0 +1,51 @@ +import uuid +import logging + +from peewee import IntegrityError, CharField + +from data.database import BaseModel + + +logger = logging.getLogger(__name__) + + +ENUM_CLASSES_WITH_SEQUENCES = [ + 'TeamRole', + 'LoginService', + 'Visibility', + 'Role', + 'AccessTokenKind', + 'BuildTriggerService', + 'ImageStorageTransformation', + 'ImageStorageSignatureKind', + 'ImageStorageLocation', + 'LogEntryKind', + 'NotificationKind', + 'ExternalNotificationEvent', + 'ExternalNotificationMethod', +] + + +def reset_enum_sequences(): + for class_name in ENUM_CLASSES_WITH_SEQUENCES: + reset_sequence(class_name) + + +def reset_sequence(class_name): + logger.info('Resetting sequence for table: %s', class_name.lower()) + unique_name = '%s' % uuid.uuid4() + + Model = type(class_name, (BaseModel,), {'name': CharField(index=True)}) + + for skips in xrange(50): + try: + Model.create(name=unique_name).delete_instance() + logger.info('Advanced sequence %s numbers', skips) + break + except IntegrityError: + pass + + +if __name__ == '__main__': + logging.basicConfig(level=logging.DEBUG) + reset_enum_sequences()