【问题标题】:DynamoDB; Fetch all data in a table - PHP动态数据库;获取表中的所有数据 - PHP
【发布时间】:2018-07-25 14:58:35
【问题描述】:

我通过here 链接的答案找到了一些帮助。 但它不适合我的用例。 我的目标是获取 DynamoDB 表中的所有记录(用户名和电子邮件)。浏览文档我必须使用 LastEvaluatedKey 或 ExclusiveStartKey 来实现分页。任何指导将不胜感激。

谢谢

【问题讨论】:

    标签: php mysql amazon-web-services amazon-dynamodb aws-php-sdk


    【解决方案1】:

    此查询将能够从 DynamoDB 表中获取所有记录。

    function scanAllData($table,$limit){
    
      $result = $this->getClientdb()->scan(array(
            'TableName' => $table,
            'Limit' => $limit,
            'Select' => 'ALL_ATTRIBUTES'                
         ),
        array('limit' => $limit),
      );
        return $result['Items'];
    }
    

    你可以这样调用这个函数。例如,您有“用户”表,列是 usernamesemails

    $getobj = $this->scanAllData('users','10');
    
    foreach($getobj as $cols){
    
       echo $cols['usernames']['S'];
       echo $cols['emails']['S'];    
    
    }
    

    【讨论】:

    • 如果获取的记录超过1MB怎么办?不需要实现分页吗?
    • 分页使用jquery数据表并管理分页。它的响应和高级功能。
    • 当我说分页时,我并不是指网站分页。根据您的代码,如果我的表包含 100 万条记录,代码会回显所有 100 万条记录吗?
    • 是的,好问题。现在检查我更新我的答案,这将利用 dynamodb 记录的限制。
    • 我不想实施限制。我想全部取走。您的原始答案会全部获取吗?
    【解决方案2】:

    我不了解 PHP,但这里有一个针对 DynamoDB Local 运行的 Java 8 示例,它依赖于 compile group: 'com.amazonaws', name: 'aws-java-sdk', version: '1.10.20'。这显示了Limit(大多数情况下,它不显示过滤器如何影响返回的项目)、LastEvaluatedKeyExclusiveStartKey 是如何工作的。你可以看到参数是如何设置的,并与 PHP 示例进行比较:

    import com.amazonaws.auth.AWSCredentials;
    import com.amazonaws.auth.BasicAWSCredentials;
    import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
    import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;
    import com.amazonaws.services.dynamodbv2.document.DynamoDB;
    import com.amazonaws.services.dynamodbv2.document.Item;
    import com.amazonaws.services.dynamodbv2.document.Table;
    import com.amazonaws.services.dynamodbv2.model.AttributeDefinition;
    import com.amazonaws.services.dynamodbv2.model.AttributeValue;
    import com.amazonaws.services.dynamodbv2.model.CreateTableRequest;
    import com.amazonaws.services.dynamodbv2.model.KeySchemaElement;
    import com.amazonaws.services.dynamodbv2.model.KeyType;
    import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput;
    import com.amazonaws.services.dynamodbv2.model.ScalarAttributeType;
    import com.amazonaws.services.dynamodbv2.model.ScanRequest;
    import com.amazonaws.services.dynamodbv2.model.ScanResult;
    import com.amazonaws.services.dynamodbv2.util.Tables;
    import com.google.common.collect.ImmutableList;
    
    import java.util.Map;
    
    public class ScanExample {
    
        private static final String TABLE_NAME = "test_table";
        private static final String HASH_ATTR_NAME = "hash";
    
        public static void main(String[] args) throws InterruptedException {
            AWSCredentials awsCredentials = new BasicAWSCredentials("key", "secret");
            AmazonDynamoDB dynamoDBClient = new AmazonDynamoDBClient(awsCredentials);
            dynamoDBClient.setEndpoint("http://localhost:4000");
    
            if (Tables.doesTableExist(dynamoDBClient, TABLE_NAME)) {
                dynamoDBClient.deleteTable(TABLE_NAME);
            }
    
            CreateTableRequest createTableRequest = new CreateTableRequest();
            createTableRequest.setTableName(TABLE_NAME);
            createTableRequest.setProvisionedThroughput(new ProvisionedThroughput(50l, 50l));
    
            createTableRequest.withKeySchema(
                    ImmutableList.of(new KeySchemaElement(HASH_ATTR_NAME, KeyType.HASH)))
                    .withAttributeDefinitions(ImmutableList.of(
                                    new AttributeDefinition(HASH_ATTR_NAME, ScalarAttributeType.N))
                    );
    
            dynamoDBClient.createTable(createTableRequest);
            Tables.awaitTableToBecomeActive(dynamoDBClient, TABLE_NAME);
    
            final Table table = new DynamoDB(dynamoDBClient).getTable(TABLE_NAME);
            createItems(table, 8);
    
            final int limit = 3;
            performScan(dynamoDBClient, limit);
        }
    
        private static void performScan(final AmazonDynamoDB client, final int limit) {
            ScanRequest scanRequest = new ScanRequest(TABLE_NAME)
                    .withLimit(limit);
    
            Map<String, AttributeValue> exclusiveStartKey = null;
            do {
                final ScanResult scanResult = client.scan(scanRequest);
                System.out.println("With exclusiveStartKey=" + exclusiveStartKey);
                scanResult.getItems().forEach(System.out::println);
                exclusiveStartKey = scanResult.getLastEvaluatedKey();
                System.out.println("Result lastEvaluatedKey=" + exclusiveStartKey);
                // Reusing same request object, just setting the start key
                scanRequest.setExclusiveStartKey(exclusiveStartKey);
                System.out.println();
            } while(exclusiveStartKey != null);
        }
    
        private static void createItems(final Table table, final int n) {
            for (int i = 0; i < n; i++) {
                table.putItem(new Item().withNumber(HASH_ATTR_NAME, i));
            }
        }
    }
    

    示例输出:

    With exclusiveStartKey=null
    {hash={N: 2,}}
    {hash={N: 1,}}
    {hash={N: 3,}}
    Result lastEvaluatedKey={hash={N: 3,}}
    
    With exclusiveStartKey={hash={N: 3,}}
    {hash={N: 5,}}
    {hash={N: 7,}}
    {hash={N: 0,}}
    Result lastEvaluatedKey={hash={N: 0,}}
    
    With exclusiveStartKey={hash={N: 0,}}
    {hash={N: 6,}}
    {hash={N: 4,}}
    Result lastEvaluatedKey=null
    

    【讨论】:

      猜你喜欢
      • 2015-04-29
      • 2014-02-25
      • 1970-01-01
      • 1970-01-01
      • 2011-12-15
      • 2016-05-13
      • 2019-01-02
      • 2023-03-24
      • 1970-01-01
      相关资源
      最近更新 更多