Beispiel #1
0
def downgrade_schema(config: metadata_store_pb2.ConnectionConfig,
                     downgrade_to_schema_version: int) -> None:
    """Downgrades the db specified in the connection config to a schema version.

  If `downgrade_to_schema_version` is greater or equals to zero and less than
  the current library's schema version, it runs a downgrade transaction to
  revert the db schema and migrate the data. The update is transactional, and
  any failure will cause a full rollback of the downgrade. Once the downgrade
  is done, the user needs to use the older version of the library to connect to
  the database.

  Args:
    config: a metadata_store_pb2.ConnectionConfig having the connection params
    downgrade_to_schema_version: downgrades the given database to a specific
      version. For v0.13.2 release, the schema_version is 0. For 0.14.0 and
      0.15.0 release, the schema_version is 4. More details are described in
      g3doc/get_start.md#upgrade-mlmd-library

  Raises:
    InvalidArgumentError: if the `downgrade_to_schema_version` is not given or
      it is negative or greater than the library version.
    RuntimeError: if the downgrade is not finished, return detailed error.
  """
    if downgrade_to_schema_version < 0:
        raise _make_exception('downgrade_to_schema_version not specified',
                              errors.INVALID_ARGUMENT)

    try:
        migration_options = metadata_store_pb2.MigrationOptions()
        migration_options.disable_upgrade_migration = True
        migration_options.downgrade_to_schema_version = downgrade_to_schema_version
        metadata_store_serialized.CreateMetadataStore(
            config.SerializeToString(), migration_options.SerializeToString())
    except RuntimeError as e:
        if str(e).startswith('MLMD cannot be downgraded to schema_version'):
            raise _make_exception(str(e), errors.INVALID_ARGUMENT)
        if not str(e).startswith('Downgrade migration was performed.'):
            raise e
        # downgrade is done.
        logging.log(logging.INFO, str(e))
 def __init__(self, config: metadata_store_pb2.ConnectionConfig):
     self._metadata_store = metadata_store_serialized.CreateMetadataStore(
         config.SerializeToString())
     # If you remove this line, errors are not thrown correctly.
     logging.log(logging.INFO, "MetadataStore initialized")