12

テーブルが DynamoDb に存在するかどうかを確認する最良の方法は何ですか?

コードがPHPであるとありがたいです。

アクティブかどうか。

エラーコード400の各種ケースに例として後ほど追記

テーブルが存在するかどうかを確認するのは非常に簡単です。次の TableStatus => CREATING、ACTIVE、DELETING、または UPDATING のいずれかになります。

しかし、エラー 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 に送信されたコマンドの構文エラー。たとえば、table_name の代わりに table_name を書き込んでいる。

[x-aws-body] => {"TableName":"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) テーブルにプロビジョニングされた容量を同時に超えた場合、私は推測しますが、チェックしませんでした。

4

6 に答える 6

9

公式の PHP SDK の「describe_table 」を参照してください。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.";
    }
}
?>
于 2012-09-05T13:33:59.670 に答える
7

これらの回答の一部は古い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;
}

うまくいけば、この完全に機能するコードが一部の人に役立つことを願っています。

于 2014-12-07T13:17:50.137 に答える
6

これを解決する答えは良いものだと思いますが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";
于 2014-01-22T18:24:05.550 に答える
3

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 for PHP 2 では、DynamoDB クライアントによって特定の例外がスローされるため、この方法の処理が容易になります。また、テーブルが存在するまでスリープするように設計された、このユース ケース(ユニット テストでの使用法を参照) 用のオブジェクトを含む "Waiter" オブジェクトもあります。

于 2012-10-07T03:18:47.263 に答える
1

テーブルが存在するかどうかを知りたいだけなら、上記の答えは正しいです。場合に備えて、ここで別の役立つ点を指摘したいと思います。

マルチスレッドまたは製品レベルのコードでは、非常に注意する必要があります。

1 つのスレッドがテーブルを削除したと仮定すると、テーブルが完全に削除されるまで、2 番目のスレッドからのクエリに対する応答としてテーブルが存在するという回答が得られます。このような場合、テーブルが削除されると、C++ のダングリング ポインター エラーのように、2 番目のスレッドのテーブル ハンドルがゾンビになります。

于 2013-07-17T03:00:36.050 に答える