Dynamodb找不到两个日期范围之间的重叠

时间:2018-07-24 20:15:54

标签: python amazon-dynamodb boto3

我正在尝试搜索数据库,以查看我要添加的日期范围是否与数据库中已经存在的日期范围重叠。

使用这个问题:Determine Whether Two Date Ranges Overlap

我为firstDay <= :end and lastDay >= :start提出了FilterExpression

def create(self, start=None, days=30):
    # Create the start/end times
    if start is None:
        start = datetime.utcnow()
    elif isinstance(start, datetime) is False:
        raise ValueError('Start time must either be "None" or a "datetime"')
    end = start + timedelta(days=days)

    # Format the start and end string "YYYYMMDD"
    start = str(start.year) + str('%02d' % start.month) + str('%02d' % start.day)
    end = str(end.year) + str('%02d' % end.month) + str('%02d' % end.day)

    # Search the database for overlap
    days = self.connection.select(
        filter='firstDay <= :end and lastDay >= :start',
        attributes={
            ':start': {'N': start},
            ':end': {'N': end}
        }
    )

    # if we get one or more days then there is overlap
    if len(days) > 0:
        raise ValueError('There looks to be a time overlap')

    # Add the item to the database
    self.connection.insert({
        "firstDay": {"N": start},
        "lastDay": {"N": end}
    })

然后我像这样调用函数:

seasons = dynamodb.Seasons()
seasons.create(start=datetime.utcnow() + timedelta(days=50))

根据要求,该方法如下所示:

def select(self, conditions='', filter='', attributes={}, names={}, limit=1, select='ALL_ATTRIBUTES'):
    """
    Select one or more items from dynamodb
    """
    # Create the condition, it should contain the datatype hash
    conditions = self.hashKey + ' = :hash and ' + conditions if len(conditions) > 0 else self.hashKey + ' = :hash'
    attributes[':hash'] = {"S": self.hashValue}
    limit = max(1, limit)

    args = {
        'TableName': self.table,
        'Select': select,
        'ScanIndexForward': True,
        'Limit': limit,
        'KeyConditionExpression': conditions,
        'ExpressionAttributeValues': attributes
    }
    if len(names) > 0:
        args['ExpressionAttributeNames'] = names
    if len(filter) > 0:
        args['FilterExpression'] = filter

    return self.connection.query(**args)['Items']

当我执行上述操作时,它会继续在数据库中插入上述startend日期,因为它没有发现任何重叠。为什么会这样?

表结构如下(JavaScript):

{
  TableName: 'test-table',
  AttributeDefinitions: [{
    AttributeName: 'dataType',
    AttributeType: 'S'
  }, {
    AttributeName: 'created',
    AttributeType: 'S'
  }],
  KeySchema: [{
    AttributeName: 'dataType',
    KeyType: 'HASH'
  }, {
    AttributeName: 'created',
    KeyType: 'RANGE'
  }],
  ProvisionedThroughput: {
    ReadCapacityUnits: 5,
    WriteCapacityUnits: 5
  },
}

1 个答案:

答案 0 :(得分:2)

好像您正在设置LIMIT = 1。您可能会用它说“只返回找到的第一个匹配项”。实际上,将“限制”设置为1意味着您只会评估在查询中找到的第一项(即在分区值范围内)。您可能需要删除该限制,以便评估分区范围内的每个项目是否重叠。