Python3: DynamoDB を使う

boto3 のインストール方法

>Ubuntu 22.04

```bash
sudo apt install python3-boto3
```

cities という名前のテーブルを作成

```py3:dynamo_create_table.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	dynamo_create_table.py
#
#					Oct/7/2017
# --------------------------------------------------------------------
import sys
import boto3
#
sys.stderr.write("*** 開始 ***\n")

dynamodb = boto3.resource('dynamodb')

table = dynamodb.create_table(
    TableName='cities',
    KeySchema=[
        {
            'AttributeName': 'key',
            'KeyType': 'HASH'  #Partition key
        },
    ],
    AttributeDefinitions=[
        {
            'AttributeName': 'key',
            'AttributeType': 'S'
        },
    ],
    ProvisionedThroughput={
        'ReadCapacityUnits': 30,
        'WriteCapacityUnits': 30
    }
)

print("Table status:", table.table_status)

sys.stderr.write("*** 終了 ***\n")
# --------------------------------------------------------------------
```

データの挿入

```py3:dynamo_insert.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	dynamo_insert.py
#
#					Oct/7/2017
# ---------------------------------------------------------------
import	sys
import	boto3
from decimal import *
# ---------------------------------------------------------------
def insert_proc (key,name,population,date_mod):
	response = table.put_item ( \
	Item={'key': key,'name': name,'population': population,'date_mod':date_mod}
	)
# ---------------------------------------------------------------
sys.stderr.write ("*** 開始 ***\n")

dynamodb = boto3.resource('dynamodb')

table = dynamodb.Table('cities')

insert_proc ("t0921","宇都宮",Decimal ("48219"),"2003-2-12")
insert_proc ("t0922","小山",Decimal ("79814"),"2003-5-24")
insert_proc ("t0923","佐野",Decimal ("69825"),"2003-7-27")

sys.stderr.write ("*** 終了 ***\n")
# ---------------------------------------------------------------
```

データのスキャン
>この方法では、1MB 以上のデータは取得できません。

```py3:dynamo_scan.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	dynamo_scan.py
#
#					Oct/7/2017
# --------------------------------------------------------------------
import	sys
import	boto3
import	decimal
from boto3.dynamodb.conditions import Key, Attr

sys.stderr.write("*** 開始 ***\n")

dynamodb = boto3.resource('dynamodb')

table = dynamodb.Table('cities')

response = table.scan()

for it in response['Items']:
	str_out = it['key'] + '\t'
	str_out += it['name'] + '\t'
	str_out += str (it['population']) + '\t'
	str_out += it['date_mod']
	print(str_out)
#
sys.stderr.write("*** 終了 ***\n")
# --------------------------------------------------------------------
```

キーを指定してデータの取得

```py3:dynamo_get.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	dynamo_get.py
#
#					Oct/7/2017
# --------------------------------------------------------------------
import sys
import boto3
from boto3.dynamodb.conditions import Key, Attr

# --------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")

dynamodb = boto3.resource('dynamodb')

table = dynamodb.Table('cities')

key_search='t0922'

response = table.query(
    KeyConditionExpression=Key('key').eq(key_search)
)

for it in response['Items']:
	str_out = it['key'] + '\t'
	str_out += it['name'] + '\t'
	str_out += str (it['population']) + '\t'
	str_out += it['date_mod']
	print(str_out)
#
sys.stderr.write("*** 終了 ***\n")
# --------------------------------------------------------------------
```

キーを指定してデータの更新

```py:dynamo_update.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	dynamo_update.py
#
#					Jul/22/2022
# --------------------------------------------------------------------
import sys
import datetime
import boto3
from boto3.dynamodb.conditions import Key, Attr

# --------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")

dynamodb = boto3.resource('dynamodb')

table = dynamodb.Table('cities')

key_target = 't0922'
population_new = 34567210
date_mod = "%s" % datetime.date.today()

response = table.update_item(
	Key={
		'key': key_target
	},
	UpdateExpression="set population = :pp, date_mod = :dd",
	ExpressionAttributeValues= {
		':pp': population_new,
		':dd': date_mod
	},
	ReturnValues='UPDATED_NEW'
)

response = table.query(
    KeyConditionExpression=Key('key').eq(key_target)
)

for it in response['Items']:
	str_out = it['key'] + '\t'
	str_out += it['name'] + '\t'
	str_out += str (it['population']) + '\t'
	str_out += it['date_mod']
	print(str_out)
#
sys.stderr.write("*** 終了 ***\n")
# --------------------------------------------------------------------
```

キーを指定してデータの削除

```py3:dynamo_delete.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	dynamo_delete.py
#
#					Oct/7/2017
# --------------------------------------------------------------------
import sys
import boto3
from boto3.dynamodb.conditions import Key

# --------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")

dynamodb = boto3.resource('dynamodb')

table = dynamodb.Table('cities')

key_search='t0922'

response = table.delete_item(
	Key={
            'key': key_search,
        }
)
#
sys.stderr.write("*** 終了 ***\n")
# --------------------------------------------------------------------
```

テーブルの削除

```py3:dynamo_delete_table.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	dynamo_delete_table.py
#
#					Oct/7/2017
# --------------------------------------------------------------------
import	sys
import	boto3

sys.stderr.write("*** 開始 ***\n")
dynamodb = boto3.resource('dynamodb')

table = dynamodb.Table('cities')

table.delete()

sys.stderr.write("*** 終了 ***\n")
# --------------------------------------------------------------------
```

次のバージョンで確認しました。

```text
$ python
Python 3.10.4 (main, Jun 29 2022, 12:14:53) [GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import boto3
>>> boto3.__version__
'1.20.34'
```