使用DynamoDB交易
#python #dynamodb #boto3 #cloud9

在本文中,我将向您展示DynamoDB交易是如何用于提供酸(原子能,一致性,隔离和耐用性)支持的方式,这将有助于您维护业务复杂应用程序中的数据完整性。

Amazon DynamoDB交易仅适用于一个帐户和同一区域。

  • 读取和写作动作已经完成,以使他们所有人都成功,要么没有成功。

  • 没有额外的费用可以为您的DynamoDB表启用交易。

  • 您只为交易中的读取或写入付款。

  • 交易中项目的汇总大小不能超过4 MB。

  • 无法使用索引进行交易。

transactwriteItems api 是一种同步写操作,在单个全或全部的操作中分组多达100个写作动作。

  • 您可以在成功或失败的单个TransActWriteItems操作中分组多个PUT,更新,删除和条件检查操作。

  • 没有两个动作可以针对同一项目。例如,您不能同时conditioncheck和更新同一项目。

  • 这些动作可以在一个或多个DynamoDB表中包含多达100个不同的项目。

  • 所有这些动作都包括表的名称,如果未满足条件,则指示是否检索/update/delete/delete/condececheck the项目的属性,并且必须满足写入/必须满足的可选条件表达式更新/删除/条件检查成功。

put <顾名思义,它写了一个新项目,这是该项目的主要键。它包括该项目属性的列表

update <顾名思义,它会更新项目的现有主键,或者如果还不存在,则会添加新项目。它包括一个定义要更新的属性

的字段

delete <顾名思义,它删除了现有项目的主要键。

conditioncheck <顾名思义,它仅检查项目的主要键。

dynamoDB如果以下任何一个是正确的:

  • 未满足条件表达式之一的条件。

  • 当交易验证错误(TransactionCanceLedException)发生时,因为在同一TransactWriteItems操作中的多个动作目标是同一项目。

  • 完成交易的配置能力不足。

  • 项目大小变得太大(大于400 kb),局部次要索引(LSI)变得太大,或者由于交易的更改而发生类似的验证错误。

  • 有一个用户错误,例如无效的数据格式。

transactgetItems api 是一种同步读取操作,该操作将多达100个组合在一起。

  • 您可以在成功或失败的单个TransActWriteItems操作中分组多个PUT,更新,删除和条件检查操作。

  • 没有两个动作可以针对同一项目。例如,您不能同时conditioncheck和更新同一项目。

  • 这些动作可以在一个或多个DynamoDB表中包含多达100个不同的项目。

get 'hat the Shand所暗示,它用给定的主键检索了该项目的一组属性。如果找不到匹配的项目,则获得不返回任何数据。

  • 它包括用于阅读的错误处理

请访问我的 GitHub Repository for DynamoDB articles 有关各种主题的不断更新。

让我们开始!

目标:

1。创建一个DynamoDB表主键/分区键和使用 create_table.py

的排序键

2。创建一个python文件 - transact_write_items.py 将交易项目写入DynamoDB表

3。创建一个python文件 - transact_get_items.py 从dynamodb表中获取项目

4。

先决条件:

Amazon DynamoDB可以与其他AWS服务集成。

  • AWS用户帐户带有管理员访问,而不是根帐户。
  • Cloud9 IDE随附Python和Boto3或 如果未安装,请安装boto3 python3 -m pip安装boto3
  • AWS命令行界面(AWS CLI)使您可以使用命令行shell中的命令与AWS服务进行交互。

使用的资源:

我已经广泛使用了本会话的boto3文档
boto3文档 - Boto3 Docs 1.26.26 documentation

transact_write_items

transact_get_items

请参阅我以前的文章有关DynamoDB table works with different methods using Python scripts and boto3的方式

该项目实施的步骤:

  • 复制Python脚本的相应代码,并将它们保存在Cloud9目录中。

  • 从1-3

  • 开始执行所有python文件

1.创建DynamoDB表主键/分区键和使用 create_table.py 的排序键

#!/usr/bin/env python3.7

# create_table.py 

# Get the method create_table() to create table "movies", and print data from table


# To use Boto3, you must first import AWS Python SDK
import boto3


# A low-level client representing DynamoDB
dynamodb_client=boto3.client('dynamodb')


# use the DynamoDB.ServiceResource.create_table() method:
# then indicate which service or services you're going to use:
# Get the service resource.
dynamodb = boto3.resource('dynamodb')


# Create the DynamoDB table.
table = dynamodb.create_table(
    TableName='movies',
    KeySchema=[
        {
            'AttributeName': 'id',
            'KeyType': 'HASH'
        },
        {
            'AttributeName': 'director',
            'KeyType': 'RANGE'
        }
    ],
    AttributeDefinitions=[
        {
            'AttributeName': 'id',
            'AttributeType': 'S'
        },
        {
            'AttributeName': 'director',
            'AttributeType': 'S'
        },
    ],
    ProvisionedThroughput={
        'ReadCapacityUnits': 5,
        'WriteCapacityUnits': 5
    }
)

# Wait until the table exists.
table.wait_until_exists()

# Print out data about the table.
print('DynamoDB Table', '=> ', table.table_name, ' created.')

Image description

2.创建一个python文件 - transact_write_items.py 将交易项目写入dynamodb表中

#!/usr/bin/env python3.7

# transact_write_items.py

from __future__ import print_function # Python 2/3 compatibility
import boto3, json
from botocore.exceptions import ClientError

client = boto3.client('dynamodb', region_name='us-east-1')

try:
    response = client.transact_write_items(
        TransactItems=[
            {
                'Put': {
                    'TableName': 'movies',
                    'Item': {
                        'id': {
                            'S': '1'
                        },
                        'director': {
                            'S': 'Yash'
                        },
                        'user': {
                            'S': 'Rev'
                        },
                        'other': {
                            'S': 'Fun working'
                        },
                    },
                    'ConditionExpression': 'attribute_not_exists(id)',
                }
            },
            {
                'Update': {
                    'TableName': 'movies',
                    'Key': {
                        'id': {
                            'S': '2'
                        },
                        'director': {
                            'S': 'Rishikesh'
                        }
                    },
                    'UpdateExpression': 'SET #o = :val',
                    'ExpressionAttributeValues': {
                        ':val': {
                            'S': 'updated value'
                        }
                    },
                    'ExpressionAttributeNames': {
                        '#o': 'Other'
                    }
                }
            }
        ]
    )
except ClientError as e:
    print(e)
    print(e.response['Error']['Message'])
else:
    print("Transact Write succeeded")

Image description

3.创建一个python文件 - transact_get_items.py 从dynamodb表中获取项目

#!/usr/bin/env python3.7

#transact_get_items.py

from __future__ import print_function # Python 2/3 compatibility
import boto3, json, decimal
from boto3.dynamodb.conditions import Key, Attr
from botocore.exceptions import ClientError

client = boto3.client('dynamodb', region_name='us-east-1')

try:
    response = client.transact_get_items(
        TransactItems=[
            {
                'Get': {
                    'TableName': "movies",
                    'Key': {
                        'id': {
                            'S': '1'
                        },
                        'director': {
                            'S': "Yash"
                        },
                    },
                },
            },
            {
                'Get': {
                    'TableName': "movies",
                    'Key': {
                        'id': {
                            'S': "2"
                        },
                        'director': {
                            'S': "Rishikesh"
                        },
                    },
                },
            },
        ]
    )

    print(json.dumps(response))

except ClientError as e:
    print(e.response['Error']['Message'])

Image description

4.验证两个方法中的某些操作-transact_write_items()和transact_get_items()

方法 - transact_write_items()

  • 当未满足条件表达式之一的条件时。

  • 发生交易验证错误时,因为在同一TransactWriteItems操作中有多个操作针对同一项目。

运行相同的文件 - transact_write_items.py再次

Image description

方法transact_get_items()

  • 当存在用户错误时,例如无效的数据格式 - 修改表'电影'的拼写为“电影”
#!/usr/bin/env python3.7

#transact_get_items.py

# Modify the spelling of the table 'movies' to 'Movies'

from __future__ import print_function # Python 2/3 compatibility
import boto3, json, decimal
from boto3.dynamodb.conditions import Key, Attr
from botocore.exceptions import ClientError

client = boto3.client('dynamodb', region_name='us-east-1')

try:
    response = client.transact_get_items(
        TransactItems=[
            {
                'Get': {
                    'TableName': "Movies", 
                    'Key': {
                        'id': {
                            'S': '1'
                        },
                        'director': {
                            'S': "Yash"
                        },
                    },
                },
            },
            {
                'Get': {
                    'TableName': "movies",
                    'Key': {
                        'id': {
                            'S': "2"
                        },
                        'director': {
                            'S': "Rishikesh"
                        },
                    },
                },
            },
        ]
    )

    print(json.dumps(response))

except ClientError as e:
    print(e.response['Error']['Message'])

Image description

清理

delete_table.py

#!/usr/bin/env python3.7


# delete_table.py
# delete the table - movies


# To use Boto3, you must first import AWS Python SDK
import boto3


# A low-level client representing DynamoDB
dynamodb = boto3.client('dynamodb')


# delete the table movies
response = dynamodb.delete_table(
    TableName='movies'
)

rm transact_write_items.py

rm transact_get_items.py

到目前为止我们所做的

我们已经成功地展示了DynamoDB交易是如何通过同时运行操作来保持数据完整性的读取和写入API的,因此所有这些操作都成功或没有成功。