Mémo de script DynamoDB (Python)

À propos de cet article

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.

À propos de Dynamo DB

Construction de l'environnement Python

Quelle classe dois-je utiliser pour faire fonctionner Dynamo DB?

DynamoDB — Boto3 Docs documentation

En premier...

--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 ".

Comment créer une instance dans la classe Resource

Impression que Resource class est plus facile à implémenter.

import boto3

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('name')

Comment créer une instance dans la classe Client

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.

Mémo de script

―― 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 ...

Définition / contenu de la table

--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.

Code de pièce commun (à l'aide de la classe Resource)

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}}

Mise à jour de l'article avec put_item

--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}}

put_item_before_after.png

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

Exemple d'utilisation ①

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'}]

Exemple d'utilisation ②

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'}]

Si vous avez un GSI (Global Secondary Index)

--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'}]

Si vous souhaitez filtrer par autre que la clé

--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'}]

Site supplémentaire / recommandé

Recommended Posts

Mémo de script DynamoDB (Python)
Mémo Python
mémo python
Mémo Python
mémo python
Mémo Python
Mémo Python
mémo débutant python (9.2-10)
mémo débutant python (9.1)
Profilage de script Python
Importer un script python
★ Mémo ★ Python Iroha
[Python] Mémo EDA
Mémo opérateur Python 3
[Mon mémo] python
Mémo de métaclasse Python3
[Python] Mémo de fond de carte
Mémo de script Bash
Mémo débutant Python (2)
[Python] Mémo Numpy
Classe Python (mémo d'apprentissage Python ⑦)
installation de python openCV (mémo)
Module Python (mémo d'apprentissage Python ④)
Mémo de visualisation par Python
Mémo du package de test Python
[Python] Mémo sur les fonctions
Utiliser DynamoDB avec Python
Recherche de bisection (python2.7) mémo
[Mon mémo] python -v / python -V
Mémo de type Liste / Dictionnaire Python3
[Mémo] Tri de liste Python3
Astuces Python (mon mémo)
[Python] Mémo sur les erreurs
Mémo de base Python - Partie 2
livre de recettes python Memo
Notes de commande de base Python
Mémo du didacticiel Python OpenCV
Script Shell @ mémo d'étude
Mémo de grammaire de base Python
Mémo de l'API TensorFlow (Python)
liens de mémo utiles python
Mémo d'opération de décorateur Python
Mémo de base Python - Partie 1
Élément de mémo Python efficace 3
Mémo Python d'énumération approximative
Enregistrer DynamoDB x Python / Decimal
Gestion des exceptions Python (mémo d'apprentissage Python ⑥)
Mémo de mesure du temps d'exécution Python
Mémo graphique Twitter avec Python
POST json avec le script Python 3
[Line / Python] Mémo d'implémentation Beacon
Exécutez le script illustrator à partir de python
Mémo tranche python et rubis
Mémo de grammaire de base Python (1)
Mémo de code personnel Python
Mémo int de type immuable Python
mémo python utilisant perl --join
Mémo récapitulatif des types de données Python