Пакет SDK для хранилища таблиц Azure — очистка таблицы

Это может показаться тривиальным вопросом, но мне трудно понять его. Мне просто нужно очистить таблицу хранилища Azure с помощью пакета SDK для .NET.

Единственное, что я нашел, это следующее:

TableOperation deleteOperation = TableOperation.Delete(entity);
TableResult result = await table.ExecuteAsync(entity);

Это потребовало бы запроса всей таблицы и повторения результатов, что с точки зрения производительности нецелесообразно. Есть ли способ очистить всю таблицу?

Спасибо


person Fabio Carello    schedule 18.10.2019    source источник


Ответы (3)


Вы можете удалить таблицу и создать ее заново. Однако имейте в виду, что удаление таблицы является асинхронной операцией на стороне хранилища и может занять не менее 30 секунд или более (в зависимости от данных). Пока таблица удаляется, вы не можете создать ее заново.

Другой альтернативой является использование транзакций Entity Batch и удаление 100 объектов за раз. Это будет быстрее, чем удаление отдельных объектов.

person Gaurav Mantri    schedule 18.10.2019

Вы можете удалить всю таблицу следующим образом:

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(storageConnectionString);
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
tableClient.DeleteTableIfExist("mytable");

Как указывает Гаурав, это делается асинхронно, поэтому, если вы хотите воссоздать таблицу, вам нужно будет использовать цикл while и продолжать попытки каждые 5 секунд, пока создание не сработает.

person Simon    schedule 19.10.2019

Похоже, что метод DeleteTableIfExists для CloudTableClient был прекращен и перенесен в Microsoft.WindowsAzure.Storage.Table.CloudTable.

Я написал метод расширения EnsureTableIsEmpty, который удаляет и воссоздает таблицу с помощью Polly, чтобы обеспечить базовую стратегию повторных попыток. Под кодом:

public static async Task<CloudTable> EnsureTableIsEmpty(this CloudTable table)
{
    await table.DeleteIfExistsAsync();
    await Policy
        .Handle<StorageException>((exc) => { return exc.Message == "Conflict"; })
        .WaitAndRetryAsync(
            5,
            retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)),
            (exception, timeSpan, retryCount, context) =>
            {
                //Logging stuff
            })
        .ExecuteAsync(() => table.CreateIfNotExistsAsync());

    return table;
}

Вроде хорошо работает. Любое предложение или импровизация были бы хороши.

person Fabio Carello    schedule 22.10.2019