Intereting Posts
Инструмент ретроспективного автоматического комментария / phpDocumentor Netbeans-esque (для Eclipse или автономного) EAN Expedia Информация об отеле URL-адрес не найден Как работает периодическая почтовая рассылка Gmail? Динамическое имя константы в PHP Добавление программно вкладки пользовательских настроек в данные продукта администратора в WooCommerce Простой пример сеанса не работает Меню подкатегорий 3-го уровня Magento Доступна библиотека создания и проверки форм и jQuery? Когда я использую постоянную PHP «PHP_EOL»? Невозможно передать нулевой аргумент при использовании типа hinting Не выбрано сообщение об ошибке базы данных Как проверить, является ли String допустимым XML-кодом, отображающим предупреждение в PHP пользовательская страница ошибки – не может попасть в обработчик Могу ли я использовать сгенерированное имя переменной в PHP? Ошибка контроллера в учебнике CodeIgniter и Doctrine

Каков наилучший способ проверить, существует ли таблица в DynamoDB?

Каков наилучший способ проверить, существует ли таблица в DynamoDb?

Я был бы признателен, если бы код был в PHP.

Либо активен, либо нет.

* Добавлен позже в качестве примера для различных случаев для кода ошибки 400

Очень легко проверить, существует ли таблица, у нее может быть один из следующих TableStatus => СОЗДАНИЕ, АКТИВНО, УДАЛЕНИЕ или ОБНОВЛЕНИЕ

но в случае, если я получаю ошибку 400, это может означать более одного.

1) по ошибке отправил пустую строку в виде имени таблицы.

[x-aws-body] => {"TableName": ""})

[body] => CFSimpleXML Object ( [__type] => com.amazon.coral.validate#ValidationException [message] => The paramater 'tableName' must be at least 3 characters long and at most 255 characters long ) [status] => 400 

2) синтаксическая ошибка в команде, отправленной в DynamoDB, например, написание имени tabel_name вместо table_name.

[x-aws-body] => {"TabelName": "test7"})

 [body] => CFSimpleXML Object ( [__type] => com.amazon.coral.validate#ValidationException [message] => The paramater 'tableName' is required but was not present in the request ) [status] => 400 

3) Я бы предположил, но не проверял, если я превышу в то же время запасную емкость на столе.

Solutions Collecting From Web of "Каков наилучший способ проверить, существует ли таблица в DynamoDB?"

Вы можете взглянуть на « описать таблицу » официального PHP SDK. 400 означает, что « не существует ». В официальной документации есть довольно обширный пример. Посмотрите, как он используется в примере «удалить», прямо внизу.

http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/LowLevelPHPTableOperationsExample.html

Вот пример (снятый) из документа

 <?php require_once dirname(__FILE__) . '/sdk/sdk.class.php'; $dynamodb = new AmazonDynamoDB(); $table_name = 'ExampleTable'; $response = $dynamodb->describe_table(array('TableName' => $table_name)); if((integer) $response->status !== 400) { $error_type = $response->body->__type; $error_code = explode('#', $error_type)[1]; if($error_code == 'ResourceNotFoundException') { echo "Table ".$table_name." exists."; } } ?> 

Некоторые из этих ответов используют старые SDK, поэтому я решил обновить этот полезный вопрос тем, что я закодировал и хорошо работает. Более новые исключения действительно облегчают эту задачу. Эта функция дает вам хорошее логическое значение для использования в скриптах.

 use Aws\DynamoDb\Exception\ResourceNotFoundException; // <-- make sure this line is at the top public function TableExists($tableName) { $ddb = DynamoDbClient::factory(array('region' => 'us-east-1')); // EC2 role security try { $result = $ddb->describeTable(array( "TableName" => $tableName )); } catch (ResourceNotFoundException $e) { // if this exception is thrown, the table doesn't exist return false; } // no exception thrown? table exists! return true; } 

Надеюсь, этот полный рабочий код поможет некоторым из вас.

Я думаю, что ответ, который решает это с помощью describeTable хорош, но обманывание с ответом кода состояния делает код менее читаемым и более запутанным.

Я решил проверить существование таблиц с помощью listTables . Вот документы

 $tableName = 'my_table'; $client = DynamoDbClient::factory(array('region' => 'us-west-2')); $response = $client->listTables(); if (!in_array($tableName, $response['TableNames'])) { // handle non-existence. // throw an error if you want or whatever } // handle existence echo "Table " . $tableName . " exists"; 

С DynamoDB вам нужно проанализировать содержимое сообщения об ошибке, чтобы узнать, какой тип ошибки вы получили, поскольку код состояния почти всегда равен 400. Вот примерная функция, которая могла бы работать, чтобы определить, существует ли таблица. Он также позволяет вам указать статус, если вы хотите проверить, существует ли он и находится ли он в определенном состоянии.

 <?php function doesTableExist(AmazonDynamoDB $ddb, $tableName, $desiredStatus = null) { $response = $ddb->describe_table(array('TableName' => $tableName)); if ($response->isOK()) { if ($desiredStatus) { $status = $response->body->Table->TableStatus->to_string(); return ($status === $desiredStatus); } else { return true; } } elseif ($response->status === 400) { $error = explode('#', $response->body->__type->to_string()); $error = end($error); if ($error === 'ResourceNotFoundException') { return false; } } throw new DynamoDB_Exception('Error performing the DescribeTable operation.'); } 

Обновление . В AWS SDK для PHP 2 определенные исключения выбрасываются клиентом DynamoDB, что упрощает его обработку. Кроме того, существуют объекты «Официант», в том числе один для этого прецедента ( см. Использование в модульном тесте ), который предназначен для сна до тех пор, пока таблица не будет существовать.

Вышеуказанные ответы верны, если вы просто хотите знать, существует ли таблица или нет. Я хочу сделать еще один полезный момент здесь.

Нужно быть очень осторожным в многопоточном или производственном коде.

Предполагая, что один поток удалил таблицу, вы все равно получите ответ, что таблица существует в ответ на ваш запрос из второго потока, пока таблица не будет полностью удалена. В таком случае, как только таблица будет удалена, дескриптор таблицы во втором потоке будет зомби, как ошибка оборванного указателя в C ++.

С dynamodb cli вы можете сделать это очень просто:

 aws dynamodb describe-table --table-name "my-table" 

Если таблица существует, она возвращает

 0 -- Command was successful. There were no errors thrown by either the CLI or by the service the request was made to. 

Если таблица не существует, она возвращает

 255 -- Command failed. There were errors thrown by either the CLI or by the service the request was made to. 

Смотрите также: