PythonでDynamoDBのQueryを実行する

前回Node.jsのLambdaでdynamoDBのクエリを実行しました。
pythonでも確認しましたのでメモ。

DynamoDBのQueryの制限

DynamoDBのクエリで取得可能なデータは最大1MBの制限があります。
フィルタ式でデータを間引こうと考えましたが、フィルタはクエリ後に適用なので効果がありませんでした。

DynamoDB での制限 – API 固有の制限
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Limits.html#limits-api

LastEvaluatedKey と ExclusiveStartKey

そのため全データを抽出するにはクエリを複数回実行する必要があります。

responseに LastEvaluatedKey が含まれている場合、まだクエリしきれないデータがありますので、ExclusiveStartKey をセットしてクエリを繰り返すことで全データをクエリできます。

コード

# -*- coding: utf-8 -*-
from __future__ import print_function
import boto3
from boto3.dynamodb.conditions import Key, Attr

dynamodb = boto3.resource('dynamodb')
TABLE_NAME = 'test_table'
device_id = 'zoe6120'

def dynamo_db_query():
    table = dynamodb.Table(TABLE_NAME)
    response = table.query(
        KeyConditionExpression=Key('deviceid').eq(device_id) & Key('timestamp').between('2017-03-10', '2019-03-14'),
        FilterExpression=Attr('test_timestamp').contains('2019'))
    ret_data = response['Items']

    while 'LastEvaluatedKey' in response:
        response = table.query(
            KeyConditionExpression=Key('deviceid').eq(device_id) & Key('timestamp').between('2017-03-10', '2019-03-14'),
            FilterExpression=Attr('test_timestamp').contains('2019'),
            ExclusiveStartKey=response['LastEvaluatedKey'])
        ret_data += response['Items']

    return ret_data

if __name__ == '__main__':
    items = dynamo_db_query()
    print(items)

Lambda環境だけでなく、ローカルマシンでもaws cliとbotoをインストールしていれば実行できます。

参考:

公式doc: ステップ 4: データをクエリおよびスキャンする
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/GettingStarted.Python.04.html

関連記事

PythonでDynamoDBのQueryを実行してCSVへ出力する

AWS LambdaからNode.jsでDynamoDBのクエリを実行する。
AWS dynamoDB のキーに予約語timestampを使用している場合のCLIからのquery

コメントを残す

メールアドレスが公開されることはありません。

two × 4 =