1

我有以下代码来创建一个 dynamoDB 表:

def create_mock_dynamo_table():
    conn = boto3.client(
        "dynamodb",
        region_name=REGION,
        aws_access_key_id="ak",
        aws_secret_access_key="sk",
    )
    conn.create_table(
        TableName=DYNAMO_DB_TABLE,
        KeySchema=[
            {'AttributeName': 'PK', 'KeyType': 'HASH'},
            {'AttributeName': 'SK', 'KeyType': 'RANGE'}
        ],
        AttributeDefinitions=[
            {'AttributeName': 'PK', 'AttributeType': 'S'},
            {'AttributeName': 'SK', 'AttributeType': 'S'}],
        ProvisionedThroughput={"ReadCapacityUnits": 5, "WriteCapacityUnits": 5},
    )
    mock_table = boto3.resource('dynamodb', region_name=REGION).Table(DYNAMO_DB_TABLE)
    return mock_table

然后我用它来创建两个 put-items :

    mock_table = create_mock_dynamo_table()
    mock_table.put_item(
        Item={
            'PK': 'did:100000001',
            'SK': 'weekday:monday:start_time:00:30',
        }
    )
    mock_table.put_item(
        Item={
            'PK': 'did:100000001',
            'SK': 'weekday:monday:start_time:00:40',
        },
        ConditionExpression='attribute_not_exists(PK)'
    )

当我做第二个put_item时,PK系统中已经存在,只有排序键不同。但是我设置的条件只存在于相同的情况下PK。所以第二个put_item应该失败吧?

4

2 回答 2

1

条件检查PutItem不针对任意项目检查条件。它仅根据具有相同主键(散列和排序键)的项目检查条件,如果这样的项目存在的话。

在您的情况下,排序键的值不同,因此当您放置第二个项目时,DynamoDB 看到该键不存在任何项目,因此该PK属性不存在。

这也是第二次运行代码时条件检查失败的原因——因为此时您已经拥有一个具有相同哈希和排序键的项目。

于 2020-05-04T00:17:25.637 回答
-1

DynamoDB 的“IOPS”非常低,实际写入需要一些时间。你可以在这里阅读更多关于它的信息。但是,如果您在不久之后再次运行代码,您会看到您将获得预期的botocore.errorfactory.ConditionalCheckFailedException.

如果我可以参考我认为您正在尝试做的事情 - 模拟数据库 + 数据。当你想模拟这样一个“昂贵”的资源时,制作一个真正的假类。您需要使用某种dal.py模块将所有数据库访问包装在实际代码中,该模块可以整合诸如写入/读取/等操作。然后,您模拟这些方法/功能。
您不想编写与所选数据库紧密耦合的代码。

最佳实践是使用 ORM 框架,例如 SQLAlchemy。现在花时间学习它是非常宝贵的。但是,你可能有我不知道的时间限制。

于 2020-04-30T16:27:05.600 回答