Python boto3 DynamoDBのscanで件数を取得する方法

scanで件数を取得するときの正しい件数の取り方がわからなかったので作成しました。

Pythonコード

import json
import boto3

dynamodb = boto3.client('dynamodb')

TABLENAME='テーブル名'
def dcnt(flt,val):
    nkey=''
    cnt=0
    while True:
        if nkey=='':
            response = dynamodb.scan(
                TableName=TABLENAME, 
                FilterExpression=flt,
                ExpressionAttributeValues=val,
                Select='COUNT'
                )
        else:
            response = dynamodb.scan(
                TableName=TABLENAME, 
                FilterExpression=flt,
                ExpressionAttributeValues=val,
                Select='COUNT',
                ExclusiveStartKey=nkey
                )
        cnt=cnt+response['Count']
        if 'LastEvaluatedKey' in response:
            nkey=response['LastEvaluatedKey']
        else:
            break
    
    return cnt

def main():
    tdata = dcnt(
        'begins_with(path, :t1) and flag = :t2',
        {":t1":{"S":"/START"},":t2":{"BOOL":True}},
        )
    print("%d\n" % (tdata))

if __name__ == '__main__':
    main()

フィルターをかけてその件数を出力する例です。

pathが’/START’で始まっていて、かつflagが真のものをカウントしています。

FilterExpressionに条件を書き、ExpressionAttributeValuesに検索する値を設定します。

DynamoDB scan 件数の取得方法

Select=’COUNT’を指定すると、response[‘Count’]に件数が返ってきます。

件数の場合も、responseに’LastEvaluatedKey’が返っていますので、ループさせて足していく必要があります。