LoginSignup
0
0

More than 1 year has passed since last update.

DynamoDBのscanでPaginatorを使用し、filterExpressionとprojectionExpressionを使う方法(bot3編)

Posted at

はじめに

  • boto3を利用したdynamoDBのscanでPaginatorを使用した場合に、filterExpressionを使用した際に、詰まったので、記事に残しておきます。

filterExpression

  • FilterExpressionとは、条件を満たした項目だけが返されるような条件を指定します。他のすべての項目は破棄されます。

projectionExpression

  • projectionExpressionとは、スキャン結果に必要な属性を指定します。

発見したバグ

  • issueとしても上がっているのですが、boto3.dynamodb.conditions を利用した方法でfilterExpressionを使用すると、うまく使えない問題が発生します。

下記がその時のサンプル

sample.py
import boto3
from boto3.dynamodb.conditions import Key, Attr

    page_iterator = paginator.paginate(
        TableName=TABLE_NAME,
        IndexName=INDEX_NAME,
        FilterExpression=Key('X').eq(x) & Key('Y').lte(y)
    )

PaginatorでFilterExpressionを利用したい場合の書き方

  • 簡単に書くと、ExpressionAttributeValuesを利用して、文字列で渡してあげるやり方にするとFilterExpressionを使用することができます。
sample2.py
def scan_dynamo():

    dynamoDBName = 'testdb'
    dateStr = 'xxx-xx-xx'
    filterExpression = 'time_stamp <= :searchDate'
    projectionExpression = 'id'

    try:
        cnt = 0
        for page in dynamoPaginator.paginate(
            TableName=dynamoDBName,
            PaginationConfig=paginationConfig,
            ProjectionExpression=projectionExpression,
            FilterExpression=filterExpression,
            ExpressionAttributeValues={
                ":searchDate": { "S": dateStr },
            }
            ): 
            print('Scan件数:{}'.format(cnt))

    except Exception as e:
        print('DynamoDBのScanに失敗しました。TableName={0}, Error={1}'.format(dynamoDBName, e))

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0