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] => {"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) 如果我同时超过了桌子上的预置容量,我会猜测但没有检查。

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.');
}

更新:在适用于 PHP 2 的 AWS 开发工具包中, DynamoDB 客户端会引发特定异常,从而使这种方式更易于处理。此外,还有一个“Waiter”对象,包括一个用于此用例的对象(请参阅单元测试中的用法),旨在休眠直到表存在。

于 2012-10-07T03:18:47.263 回答
1

如果您只想知道该表是否存在,上述答案是正确的。我想在这里提出另一个有用的观点,以防万一。

在多线程或生产级代码中应该非常小心。

假设一个线程删除了该表,那么您仍然会得到该表存在的答案,以回答来自第二个线程的查询,直到该表被完全删除。在这种情况下,一旦表被删除,第二个线程中的表句柄就会变成僵尸,就像 C++ 中的悬空指针错误一样。

于 2013-07-17T03:00:36.050 回答
0

使用 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.

也可以看看:

于 2017-03-24T22:25:24.113 回答