什么是检查表中DynamoDB存在的最好方法?(What is the best way to ch

2019-07-31 09:14发布

什么是检查表中DynamoDb存在的最好方法?

我将不胜感激,如果代码是在PHP。

无论是主动还是不行。

*以后添加作为一个例子来各种情况为错误代码400

这很容易检查是否存在表中,它可以有以下TableStatus =>创建,主动,删除或更新的一个

但如果我得到错误400这可能意味着不止一两件事。

1)发送空字符串被误表名。

[X-AWS体] => { “表名”: “”})

[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代替表名。

[X-AWS体] => { “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)我猜,但没有检查,如果我超出此同时表上的供应能力。

Answer 1:

你可以看看官方的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.";
    }
}
?>


Answer 2:

有些答案是使用旧的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;
}

希望这个完整的工作代码可以帮助你们中的一些。



Answer 3:

我认为,解决这个的答案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";


Answer 4:

随着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客户端,使得这样就好办了。 另外,还有一些“服务员”对象, 包括一个用于该用途的情况下 ( 见在单元测试中使用 ),其被设计成休眠状态,直到表中存在。



Answer 5:

以上的答案是正确的,如果你只是想知道表是否存在与否。 我不想再拍有用的点在这里的情况。

每个人都应该在多线程或生产水平的代码非常小心。

假设一个线程删除的表, 那么你仍然会得到该表在回答第二个线程的查询存在的答案 ,直到表被完全删除。 在这种情况下,一旦该表被删除,在第二线程中的表句柄是僵尸,如在C ++中的悬空指针误差。



Answer 6:

随着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.

也可以看看:

  • http://docs.aws.amazon.com/cli/latest/reference/dynamodb/describe-table.html
  • http://docs.aws.amazon.com/cli/latest/topic/return-codes.html


文章来源: What is the best way to check if table exists in DynamoDB?