jackod123
jackod123

Reputation: 11

Can't update record in DynamoDB

Really new to python and coding in general - would really help if someone could point me in the right direction with some code.

So to start off with I am making a proof of concept for a car park running AWS Rekognition and I need some help with updating the database. As you can see with the code below it inputs the reg_plate, entry_time and exit_time into the database all okay. But, what I am trying to do is when Rekognition is invoked a second time with the same reg_plate it updates the exit_time only for the current record in the database.

import boto3
import time

def detect_text(photo, bucket):
    client=boto3.client('rekognition')
    response=client.detect_text(Image={'S3Object':{'Bucket':bucket,'Name':photo}})
                        
    textDetections=response['TextDetections']
    for text in textDetections:
        if text['Type'] == 'LINE':
            return text['DetectedText']
    return False

def main(event, context): 

    bucket=''
    photo='regtest.jpg'
    text_detected=detect_text(photo,bucket)
    
    if (text_detected == False):
        exit()
    
    print("Text detected: " + str(text_detected))
    
    entry_time = str(int(time.time()))
    dynamodb = boto3.client('dynamodb')
    table_name = 'Customer_Plate_DB'
    
    item = {
        'reg_plate': {
            'S': str(text_detected)
        },
        'entry_time': {
            'S': entry_time
        },
        'exit_time': {
            'S': str(0)
        }
    }
    
    dynamodb.put_item(TableName=table_name, Item=item)

Tried various if statements but with no luck as whenever I try it just keeps making new records in the database and the exit_time is never updated.

Upvotes: 1

Views: 342

Answers (1)

Leeroy Hannigan
Leeroy Hannigan

Reputation: 19893

In DynamoDB a PutItem will overwrite/insert data, so its not what you need if you are wanting to update a single attribute. You will need to use UpdateItem:

response = dynamodb.update_item(
        TableName=table_name,
        Key={
            'reg_plate': {'S': str(text_detected)}, 
            'entry_time': {'S': entry_time}
        },
        UpdateExpression="SET #t = :t",
        ExpressionAttributeValues={ ":t": str(0) },
        ExpressionAttributeNames={"#t":"exit_time"},
        ConditionExpression='attribute_exists(reg_plate)'
    )

In your question you do not tell me what your partition and/or sort keys are, so here I assume you have a partition key only called pk, which you can change to suit your needs.

In the above example, for item where pk = '123' I set exit_time to a value only if the item already exists in your table (Condition Expression).

Upvotes: 4

Related Questions