def get_status( self, migration_key: MigrationKey ) -> Tuple[Status, Optional[datetime]]: """ Returns the status and timestamp of a migration. """ if migration_key in self.__status: return self.__status[migration_key] try: data = self.__connection.execute( f"SELECT status, timestamp FROM {self.__table_name} FINAL WHERE group = %(group)s AND migration_id = %(migration_id)s", { "group": migration_key.group.value, "migration_id": migration_key.migration_id, }, ) if data: status, timestamp = data[0] self.__status[migration_key] = (Status(status), timestamp) else: self.__status[migration_key] = (Status.NOT_STARTED, None) return self.__status[migration_key] except ClickhouseError as e: # If the table wasn't created yet, no migrations have started. if e.code != errors.ErrorCodes.UNKNOWN_TABLE: raise e return Status.NOT_STARTED, None
def _get_migration_status(self) -> Mapping[MigrationKey, Status]: data: MutableMapping[MigrationKey, Status] = {} migration_groups = ( "(" + ( ", ".join( [ escape_string(group.value) for group in get_active_migration_groups() ] ) ) + ")" ) try: for row in self.__connection.execute( f"SELECT group, migration_id, status FROM {self.__table_name} FINAL WHERE group IN {migration_groups}" ): group_name, migration_id, status_name = row data[MigrationKey(MigrationGroup(group_name), migration_id)] = Status( status_name ) except ClickhouseError as e: # If the table wasn't created yet, no migrations have started. if e.code != errors.ErrorCodes.UNKNOWN_TABLE: raise e return data