当前位置: 首页 > 知识库问答 >
问题:

如何使用serverless.yml创建dynamodb表,并使用python boto3删除其中的项?

连德水
2023-03-14

我已经使用以下serverless.yml创建了Dynamodb表:

resources:
  Resources:
    myTable:
      Type: AWS::DynamoDB::Table
      DeletionPolicy: Retain
      Properties:
        TableName: myTable
        AttributeDefinitions:
          - AttributeName: id
            AttributeType: S
          - AttributeName: firstname
            AttributeType: S
          - AttributeName: lastname
            AttributeType: S
        KeySchema:
          - AttributeName: id
            KeyType: HASH
          - AttributeName: firstname
            KeyType: RANGE
        BillingMode: PAY_PER_REQUEST
        SSESpecification:
          SSEEnabled: true

但我有一个问题:

出现错误:myTable-一个或多个参数值无效:KeySchema中的属性数与AttributeDefinitions中定义的属性数不完全匹配(服务:AmazonDynamoDBv2;状态代码:400;错误代码:ValidationException;请求ID:PEI9OT7E72HQN4N5MQUOIUQ18JVV4KQNSO5AEMVJF66Q9ASUAJG;代理:null)。

你能帮我创建的Dynamodb表使用serverless.yml?我如何删除项目的名字是"First"在这个表中使用python boto3?

共有2个答案

花稳
2023-03-14

原因是您的所有属性名称在属性定义必须包含在KeySchema中。我可以看到lastname属性在那里丢失了。

郭华美
2023-03-14

如果要保留键模式,必须从属性定义中删除姓氏

Resources:
  myTable:
    Type: AWS::DynamoDB::Table
    DeletionPolicy: Retain
    Properties:
      TableName: myTable
      AttributeDefinitions:
        - AttributeName: id
          AttributeType: S
        - AttributeName: firstname
          AttributeType: S
      KeySchema:
        - AttributeName: id
          KeyType: HASH
        - AttributeName: firstname
          KeyType: RANGE
      BillingMode: PAY_PER_REQUEST
      SSESpecification:
        SSEEnabled: true

但如果要保留lastname,可以为表定义本地二级索引

Resources:
  myTable:
    Type: AWS::DynamoDB::Table
    DeletionPolicy: Retain
    Properties:
      TableName: myTable
      AttributeDefinitions:
        - AttributeName: id
          AttributeType: S
        - AttributeName: firstname
          AttributeType: S
        - AttributeName: lastname
          AttributeType: S
      KeySchema:
        - AttributeName: id
          KeyType: HASH
        - AttributeName: firstname
          KeyType: RANGE
      LocalSecondaryIndexes:
        - IndexName: by-lastname
          KeySchema: 
          - AttributeName: id
            KeyType: HASH
          - AttributeName: lastname
            KeyType: RANGE
          Projection: 
            ProjectionType: ALL
      BillingMode: PAY_PER_REQUEST
      SSESpecification:
        SSEEnabled: true

通过以上,您可以使用LSI对lastname进行排序,而firstname将在主表中使用。

如何使用python boto3删除此表中名为“first”的项?

除非您想执行扫描,否则您不能直接使用boto3或不使用boto3进行扫描,这应该避免,因为这可能会很昂贵且效率低下。一般的解决方案是定义一个全局二级索引,其中firstname将是新的主键。然后,您将在GSI中查询感兴趣的firstname,以获取要删除的记录的id。如果您有多条记录具有相同的firstname,可能就是这种情况,那么您会得到许多记录(与主表不同,GSI主键不需要是唯一的)。

具有LSI和GSI的示例表:

Resources:
  myTable:
    Type: AWS::DynamoDB::Table
    DeletionPolicy: Retain
    Properties:
      TableName: myTable
      AttributeDefinitions:
        - AttributeName: id
          AttributeType: S
        - AttributeName: firstname
          AttributeType: S
        - AttributeName: lastname
          AttributeType: S
      KeySchema:
        - AttributeName: id
          KeyType: HASH
        - AttributeName: firstname
          KeyType: RANGE
      LocalSecondaryIndexes:
        - IndexName: by-lastname
          KeySchema: 
          - AttributeName: id
            KeyType: HASH
          - AttributeName: lastname
            KeyType: RANGE
          Projection: 
            ProjectionType: ALL
      GlobalSecondaryIndexes:
        - IndexName: firstname-gsi
          KeySchema: 
            - AttributeName: firstname
              KeyType: HASH
          Projection: 
            ProjectionType: ALL
          #ProvisionedThroughput: 
          #  ProvisionedThroughput        
      BillingMode: PAY_PER_REQUEST
      SSESpecification:
        SSEEnabled: true

 类似资料:
  • 我试图触发一个lambda函数,在多个表上使用无服务器的dynamodb流。yml配置。可以在aws serverless.yml的触发器上配置通用arn吗。 有dynamodb表req\u tnt1、req\u tnt2、req\u tnt2…等等。每当req\u tnt*表更新时,我都会触发lambda并将信息存储在elasticsearch中以进行自由文本搜索。我能够处理触发lambda和更

  • 我们可以从AWS控制台创建、编辑、删除组来维护DynamoDb表的逻辑分组。我搜索了AWS文档和论坛,但没有找到如何使用CloudFormation创建DynamoDb表组的方法,也没有找到如何使用AWS.NET SDK在组内创建表的方法。这可能吗?

  • 问题内容: 我要执行以下操作: 我已经尝试过了,但是它似乎并不总是可以工作。它在一个上下文中可以工作,但是在另一个上下文中,相同的代码在第二个“ Class.forName(” MyClass“)”上崩溃了…… 总是调用带来正确的课堂,并尝试过,但没有区别。不知何故,在某些情况下,第二个Class.forName找到了该类,而在其他情况下,它只是坏了……我错过了什么吗? 问题答案: 我发现我的代码

  • 问题内容: 我有一个存储过程,该过程将通过复制旧表的结构来创建新表。但是在创建新表之前,我需要检查该表是否存在,如果存在,则需要先删除该表。这是我的存储过程。 但是,如果该表存在,我总是会收到类似以下的错误。哪里错了? 问题答案: 让我感到难过…在这种情况下,“如果存在”似乎无法与exec配合使用。更新了以下脚本:

  • 我正在我们的项目中实施DynamoDB。我们必须将大型数据字符串放入数据库中,所以我们将数据拆分为小块,并插入多行,其中只有一个属性值发生了更改—这是字符串的一部分。一列(范围键)包含多个零件。插入和选择数据对于大小字符串都非常有效。问题是删除项目。我了解到,当您想要删除某个项时,需要为该项指定主键(哈希键或哈希键和范围键-取决于表)。但如果我想删除对其中一个属性具有特定值的项目,该怎么办?我是否

  • 我正在terraform中创建具有以下模式的dynamodb表: 地形代码 并获得以下错误:aws_dynamodb_table。: AWS错误创建DynamoDB表:验证异常:检测到1个验证错误:值'KEYS-ONLY'在'global二级Indexes.1.member.projection.projection类型'未能满足约束:成员必须满足枚举值集:[ALL,包括,KEYS_ONLY] 这