はじめに
- 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))
参考