AWS Python boto3でDynamoDBを扱う

個人開発したアプリの宣伝
目的地が設定できる手帳のような使い心地のTODOアプリを公開しています。
Todo with Location

Todo with Location

  • Yoshiko Ichikawa
  • Productivity
  • Free

スポンサードリンク

PythonからAWSの各リソースにアクセスするにはboto3を利用します。

AWS Lambdaで利用する際は、そのままboto3が扱えるのでLambdaパッケージにboto3を含める必要はありません。


DynamoDBのリソースを取得

import boto3
dynamodb = boto3.resource('dynamodb')


Itemの登録

idがパーテーションキーのuserテーブルにitemを登録する例。

now = time.time()
usertable = dynamodb.Table("user")
usertable.put_item(
  Item={
    'id': 1,
    'username': 'YourName',
    'email': 'youremail@domain',
    'accepted_at': decimal.Decimal(str(now)),
  }
)

DynamoDBはdate型のフィールドがないので、Decimal型でUnixタイムスタンプを登録しています。DB上で日付比較してフェッチしない場合はタイムゾーン込みの文字列として、2020-06-06T16:43:00.000+09:00のように保存しても問題ないと思う。


Itemの更新

Keyで更新対象のitemを指定し、UpdateExpressionでプリペーアドクエリを、ExpressionAttributeValuesでプレースホルダにbindする値を記述する。

usertable = dynamodb.Table("user")
response = usertable.update_item(
  Key={
    'id': 1
  },
  UpdateExpression="set username = :userName",
  ExpressionAttributeValues= {
    ':userName': 'YourFriendName'
  },
  ReturnValues='UPDATED_NEW'
)

尚、更新後の値をReturnValuesとして指定すると更新した値を更新と同時に受け取ることができる。

response['Attributes']['username']


プリペーアドクエリ

プリペアードクエリはSQLのアップデート文ライクに記述できる。

例えば、

UpdateExpression="set value = value + 1"

のようにフィールドの値に対して操作することができる。尚、RDB同様、書き込みは直列に行われるので、上記の記述だとロストアップデートの対象にならない。