L'autre jour, j'ai écrit du code pour faire fonctionner Dynamo DB sur AWS en utilisant Python. Pour rappel, je résumerai le script de base de l'époque et l'idée propre à Dynamo DB. Ce n'est pas exhaustif, mais je vais mentionner le minimum plus alpha. J'espère que cela aide les étrangers.
DynamoDB — Boto3 Docs documentation
--Pour Boto3, principalement Resource class et [Client] pour travailler avec Dynamo DB Il existe deux classes](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#client), quelle que soit la classe que vous utilisez pour ajouter des éléments à la table. Et la recherche est possible. «Je ne peux pas dire grand-chose parce que je ne suis pas familier avec cela, mais quand je me réfère au site suivant, il dit que" la classe client est moins abstraite ".
Impression que Resource class est plus facile à implémenter.
import boto3
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('name')
La Classe client couvre la plupart des API pour chaque service et est "basique". impression
import boto3
client = boto3.client('dynamodb')
#Le nom de la table est spécifié lors de l'utilisation de la table.
―― Puisqu'il s'agit d'un mémo au moment de la vérification personnelle, dans quelle mesure sera-t-il pour votre référence ...
--Contient des informations sur la station (préfecture et coordonnées). --Définissez prefecture comme clé de partition et id comme clé de tri comme clé primaire.
La clé primaire (Remarque: la clé de partition et la clé de tri) et les attributs sont tous de type caractère.
"Mise en garde! 》 Dans cet article, des chaînes de caractères japonais sont utilisées pour la clé de partition, mais c'est juste pour faciliter l'explication. ――Je pense qu'il est courant d'utiliser des chaînes de caractères alphanumériques et des chaînes numériques.
import boto3
from boto3.dynamodb.conditions import Key, Attr
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('table_name')
put_item
response = table.put_item(
Item = {
'prefecture':'Iwate',
'id':'5',
'stationName':'Morioka'
}
)
print(response)
# {'ResponseMetadata': {'RequestId': 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNO', 'HTTPStatusCode': 200, 'HTTPHeaders': {'server': 'Server', 'date': 'Mon, 28 Sep 2020 14:24:47 GMT', 'content-type': 'application/x-amz-json-1.0', 'content-length': '2', 'connection': 'keep-alive', 'x-amzn-requestid': 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNO', 'x-amz-crc32': '2745614147'}, 'RetryAttempts': 0}}
--Si un élément avec la même clé primaire existe déjà sur la table, l'élément sera mis à jour.
response = table.put_item(
Item = {
'prefecture':'Hokkaido',
'id':'13',
'stationName':'Himekawa (mis à jour)',
'hoge': 'fuga'
}
)
print(response)
# {'ResponseMetadata': {'RequestId': 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNO', 'HTTPStatusCode': 200, 'HTTPHeaders': {'server': 'Server', 'date': 'Mon, 28 Sep 2020 15:02:47 GMT', 'content-type': 'application/x-amz-json-1.0', 'content-length': '2', 'connection': 'keep-alive', 'x-amzn-requestid': 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNO', 'x-amz-crc32': '2745614147'}, 'RetryAttempts': 0}}
get_item --Si vous avez uniquement défini la clé de partition comme clé primaire, définissez la clé de partition sur Clé.
response = table.get_item(
Key={
'prefecture':'Hokkaido',
'id':'1'
}
)
print(response['Item'])
# {'stationName': 'Hakodate', 'prefecture': 'Hokkaido', 'id': '1', 'latitude': '41.773709', 'stationId': '1110101', 'longitude': '140.726413'}
query
Même si la clé de partition et la clé de tri sont définies comme clé limary, la méthode de requête peut être utilisée pour rechercher en utilisant uniquement la clé de partition.
response = table.query(
KeyConditionExpression = Key('prefecture').eq('Hokkaido')
)
print(response['Items'])
# [{'stationName': 'Hakodate', 'prefecture': 'Hokkaido', 'id': '1', 'latitude': '41.773709', 'stationId': '1110101', 'longitude': '140.726413'}, {'stationName': 'Rivière Akai', 'prefecture': 'Hokkaido', 'id': '10', 'latitude': '42.003267', 'stationId': '1110110', 'longitude': '140.642678'}, {'stationName': 'Komagatake', 'prefecture': 'Hokkaido', 'id': '11', 'latitude': '42.038809', 'stationId': '1110111', 'longitude': '140.610476'}, {'stationName': 'Higashiyama', 'prefecture': 'Hokkaido', 'id': '12', 'latitude': '42.06172', 'stationId': '1110112', 'longitude': '140.605222'}]
response = table.query(
KeyConditionExpression = Key('prefecture').eq('Hokkaido')&Key('id').begins_with('1'),
ScanIndexForward = False,
Limit = 2,
)
print(response['Items'])
# [{'stationName': 'Choshiguchi', 'prefecture': 'Hokkaido', 'id': '16', 'latitude': '42.015471', 'stationId': '1110116', 'longitude': '140.720656'}, {'stationName': 'Ryuyama Onsen', 'prefecture': 'Hokkaido', 'id': '15', 'latitude': '42.003483', 'stationId': '1110115', 'longitude': '140.716358'}]
--GSI (Global Secondary Index) vous permet de définir une nouvelle clé de partition / clé de tri en plus de la clé de partition de table / clé de tri. --Il existe également un LSI (Local Secondary Index), mais LSI définit la clé de partition telle quelle et uniquement la clé de tri. ――Cette page est facile à comprendre.
query
response = table.query(
IndexName = 'stationName-stationId-index',
KeyConditionExpression = Key('stationName').eq('Ryuyama Onsen'),
)
print(response['Items'])
# [{'stationName': 'Ryuyama Onsen', 'prefecture': 'Hokkaido', 'id': '15', 'latitude': '42.003483', 'longitude': '140.716358', 'stationId': '1110115'}]
--Utilisez le paramètre FilterExpression
response = table.query(
KeyConditionExpression = Key('prefecture').eq('Hokkaido'),
FilterExpression = Attr('stationId').begins_with('1110114'),
ScanIndexForward = False
)
print(response['Items'])
# [{'stationName': 'Ikedaen', 'prefecture': 'Hokkaido', 'id': '14', 'latitude': '41.990692', 'stationId': '1110114', 'longitude': '140.700333'}]
Recommended Posts