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

DyanmoDB不能满足KeySchema

韦知
2023-03-14

我正在尝试使用boto构建DynamoDB表,这将在表中保存IAM策略的各个方面。我已经为keyschema定义了属性,我不理解错误。我对DYanmoDB和AWS非常陌生。这是我的代码:

table =dynamodb.create_table(
    TableName='GoodTable',
            KeySchema=[
            {
                'AttributeName': 'Name',
                'KeyType': 'HASH'  
            },
            {
                'AttributeName': 'Instance Type',
                'KeyType': 'RANGE'  
            },
            {
                'AttributeName': 'Region',
                'KeyType': 'RANGE'  
            },
            {
                'AttributeName': 'Volume Size',
                'KeyType': 'RANGE'  
            },
        ],
    AttributeDefinitions=[
    {
      "AttributeName": "Name",
      "AttributeType": "S"
    },
    {
      "AttributeName": "Instance Type",
      "AttributeType": "S"
    },
    {
      "AttributeName": "Region",
      "AttributeType": "S"
    },
    {
      "AttributeName": "Volume Size",
      "AttributeType": "N"
    }
    ],
  ProvisionedThroughput={
    "ReadCapacityUnits": 1,
    "WriteCapacityUnits": 1
  }
)
time.sleep(20)
table = dynamodb.Table('GoodTable')
response = table.put_item(
    Item= {
        'Name': 'GoodName', 
    }
)
response = table.put_item(
    Item= {
        'Instance Type': 't2.micro',
    }
)
response = table.put_item(
    Item= {
        'Region': 'us-east-1',
    }
)
response = table.put_item(
    Item= {
        'Volume Size': '20',
    }
)

这就是我得到的错误:

botocore.exceptions.ClientError:调用CreateTable操作时发生错误(ValidationException):检测到1个验证错误:值'[com.amazonaws.dynamodb.v20120810。KeySchemaElement@ad4dcbcd,com.amazonaws.dynamodb.v20120810。KeySchemaElement@126b7ad8,com.amazonaws.dynamodb.v20120810。KeySchemaElement@ca666a07,com.amazonaws.dynamodb.v20120810。KeySchemaElement@6478bc3a]'at'keySchema'未能满足约束:成员的长度必须小于或等于2

共有3个答案

巫马浩言
2023-03-14

字段名是“关键架构”,而不是“表格架构”或其他任何东西,它只定义了键。该表是“无模式”的,这意味着每个记录可以有不同的结构,不需要定义它。您必须只定义密钥。在DynamoDB中,键只能是HASH列或HASH RANGE列。你应该想想你想使用这两种可能性中的哪一种。如果使用HASH RANGE,则必须同时查询这两个表。阅读许多记录是昂贵的。

所以想想你想存储什么,以及你将如何查询。相应地设计散列键。

AWS首席NoSQL技术专家Rick Houlihan提出的单表复杂哈希键数据模型有很大的争议https://youtu.be/HaEPXoXVf2k?t=2573 . 当我观看视频时,我开始以不同的方式设计DynamoDB表格,这改善了我的生活。

然后,自然的趋势是选择一个有点唯一的列并将其用作散列键,但这确实限制了您的查询选项。一个设计良好的散列键可以帮助您在不增加索引的情况下进行查询,因此您的解决方案更便宜、更高效。

如上所述,除了键之外,没有定义任何结构。但这并不意味着每条记录都应该是完全随机的。然而,在一个表中存储多个项目类型是有意义的,其中每个项目类型都具有相同的结构-看视频,这是值得的。

在您的情况下,使用实例名称作为哈希可能会有风险,因为它在各个区域中可能不是唯一的。您甚至可以在同一区域中拥有两个具有相同名称的实例,因为名称只是一个标记。如果您不知道或不想存储实例ID,您必须想出其他一些聪明的解决方案。

例如,哈希可以是:INSTANCE::,排序键可以是实例创建时间。还有一项额外的工作要为每个记录编写和分解密钥。我通过创建一个python类解决了这个问题,该类将put\u item/get\u item包装在一个处理键的方法中。

浦墨竹
2023-03-14

代码中有两个问题:

  1. 如前所述,除非使用全局或本地二级独立文件,否则不能有超过两个关键属性。
  2. dynamodb.Table('GoodTable')不正确,因为您需要resource

您可以检查修改后的代码:

table = dynamodb.create_table(
    TableName='GoodTable',
            KeySchema=[
            {
                'AttributeName': 'Name',
                'KeyType': 'HASH'  
            }
        ],
    AttributeDefinitions=[
    {
      "AttributeName": "Name",
      "AttributeType": "S"
    }   
    ],
  ProvisionedThroughput={
    "ReadCapacityUnits": 1,
    "WriteCapacityUnits": 1
  }
)
import time
time.sleep(20)



table = boto3.resource('dynamodb').Table('GoodTable')

response = table.put_item(
    Item= {
        'Name': 'GoodName', 
        'Instance Type': 't2.micro',
    }
)
response = table.put_item(
    Item= {
        'Name': 'GoodName2',       
        'Instance Type': 't2.micro',
    }
)
response = table.put_item(
    Item= {
        'Name': 'GoodName3',       
        'Region': 'us-east-1',
    }
)
response = table.put_item(
    Item= {
        'Name': 'GoodName4',       
        'Volume Size': '20',
    }
)

许黎明
2023-03-14

在DynamoDB中只能有2个字段作为主键。你只能有一个散列密钥和一个范围密钥最大。

编码表

对于复合主键(分区键和排序键),必须按照以下顺序提供两个元素:第一个元素必须具有哈希的KeyType,第二个元素必须具有RANGE的KeyType。

您可以在DynamoDB中设置二级索引

 类似资料:
  • 我正在使用Eclipse for Java和AWS工具包。我运行以下代码: 我在控制台视图中看到: […{Name:Name,AttributeDataType:String,DeveloperOnlyAttribute:false,Mutable:true,Required:false,StringAttributeConstraints:{MinLength:0,MaxLength:2048}

  • 我正在创建一个AWS CodePipeline资源与terraform: 运行时,在它返回 编辑: 新的部署阶段是: 我有这个应用程序创建使用: 组使用:

  • 我觉得我一定忽略了什么。 null Grunt@0.4.2应该匹配所有这些依赖项,但npm说它不匹配,安装失败。我是不是忽略了什么? 根据请求,我的package.json文件:

  • 我正在尝试在AWS中应用身份池策略。我正在使用awc cli设置策略,但标题中经常出现以下例外情况: 调用AttachPrincipalPolicy操作时发生错误(InvalidRequestException):检测到1个验证错误:“policyName”处的值“DeviceShadowPolicy”未能满足约束:成员必须满足正则表达式模式:[\w=,。@-] 这是我使用的命令: 我不明白为什么

  • 我正在为https://efactura.dgi.gub.uy:6470/eprueba/ws_personagetactempresarialprueba?wsdl第三方WSDL实现一个webservice客户机。 我使用apache-cxf3.0.4wsdl2java生成java clases。 我需要如何解决这个错误?

  • 我正在尝试使用cucumber框架与selenium和appium,但在执行cucumber特性时,我得到以下异常: @CucumberOptions(features={“src//test//java//feature”},glue={“pages”},plugin={“pretty”,“html:target/cucumber”},tags={“@web”,“@test”,“@appium”