Amazon dynamodb Dynamodb中的条件插入

Amazon dynamodb Dynamodb中的条件插入,amazon-dynamodb,boto3,python-3.7,Amazon Dynamodb,Boto3,Python 3.7,我正在创建一个休假跟踪应用程序,我想在其中存储用户ID以及起始日期和截止日期。我使用Amazon的DynamoDB作为数据库,用户通过自定义命令输入休假。 例句:请一天一天的假 我希望避免数据库中出现重复条目。例如,如果用户已在2019年10月6日至2019年10月10日之间申请休假,并在相同日期之间再次申请休假,则他们应收到一条消息,说明此假期已存在,不应为相同日期创建新记录 但是,一个用户可以申请多个假期,两个用户可以在同一日期之间休假 我尝试使用条件语句,如下所示: 表1.put_项目 项

我正在创建一个休假跟踪应用程序,我想在其中存储用户ID以及起始日期和截止日期。我使用Amazon的DynamoDB作为数据库,用户通过自定义命令输入休假。 例句:请一天一天的假

我希望避免数据库中出现重复条目。例如,如果用户已在2019年10月6日至2019年10月10日之间申请休假,并在相同日期之间再次申请休假,则他们应收到一条消息,说明此假期已存在,不应为相同日期创建新记录

但是,一个用户可以申请多个假期,两个用户可以在同一日期之间休假

我尝试使用条件语句,如下所示:

表1.put_项目 项目={ “离开id”:离开id, “用户id”:用户id, “起始日期”:起始日期, “截止日期”:截止日期, }, ConditionExpression='attribute\u not\u existsuser\u id和attribute\u not\u exists from\u date和attribute\u not\u exists to\u date' 其中leave_id是分区键。但是,这不起作用,每次都会添加一个新行,即使是相同的日期。我已经研究了类似的其他问题,但还不能理解如何正确配置


关于我应该如何处理这个问题,或者如果我应该遵循不同的设计,有什么想法吗?

如果您使用表中尚不存在的leave\u id调用代码,则将始终插入该项。如果您使用表中已存在的leave_id调用代码,则调用PutItem操作时,您应该会收到错误ConditionalCheckFailedException:conditional request failed错误消息

我有两个建议:

如果不想更改表,可以创建一个以用户id作为分区键的二级索引,然后查询给定用户具有一些from\u date和to\u date属性的所有项目的索引。 像这样:

table.query(
    IndexName='user_id-index',
    KeyConditionExpression=Key('user_id').eq(user_id),
    FilterExpression=Attr('from_date').exists() & Attr('from_date').exists()
)
然后,您需要检查重叠的请假请求等。例如,在已经到位的请假请求完成之前开始的请假请求。确定请假请求有效后,您将调用put_item


另一个建议(可能是更好的建议)是在表上创建一个复合主键,将user\u id作为分区键,并将其保留为排序键。这样,您就可以对特定用户的所有请假请求执行查询,而无需创建辅助索引。

谢谢您的建议!leave_id是唯一标识每行的随机uuid。因此,我不确定如何将其用作排序键,因为它对每一行都是唯一的。我认为这不会是一个问题,关键是能够查询表中特定用户的所有休假请求。如果您不能/不想更改表的定义方式,您可以尝试我的第一个建议,使用索引。