【问题标题】:Can't add secondary index for dynamodb in cdk using python无法使用 python 在 cdk 中为 dynamodb 添加二级索引
【发布时间】:2020-02-09 05:11:00
【问题描述】:

我正在尝试创建一个带有分区和排序键的二级索引的 dynamoDB 表。 我可以创建没有二级索引的表,但还没有找到添加二级索引的方法

我已经查看了这两个资源,但没有找到任何可以实际显示我需要在我的 cdk python 脚本中使用哪些代码来创建具有二级索引的资源的代码 https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-dynamodb.Table.html https://docs.aws.amazon.com/cdk/api/latest/docs/aws-dynamodb-readme.html

这是创建表格的代码

table_name = 'event-table-name'
    event_table = dynamoDB.Table(self, 'EventsTable',
         table_name=table_name,
         partition_key=Attribute(
             name='composite',
             type=AttributeType.STRING
         ),
         sort_key=Attribute(
             name='switch_ref',
             type=AttributeType.STRING
         ),
         removal_policy=core.RemovalPolicy.DESTROY,
         billing_mode=BillingMode.PAY_PER_REQUEST,
         stream=StreamViewType.NEW_IMAGE,
                                 )

这是我需要附加的二级索引

secondaryIndex = dynamoDB.GlobalSecondaryIndexProps(
        index_name='mpan-status-index',
        partition_key=Attribute(
            name='field1',
            type=AttributeType.STRING
        ),
        sort_key=Attribute(
            name='field2',
            type=AttributeType.STRING
        ),
    )

我尝试在表创建中添加块并尝试在表上调用 addSecondaryindex 方法。但是两者都失败了,要么说意外的关键字,要么对象没有属性 addGlobalSecondaryIndex

【问题讨论】:

    标签: python-3.x amazon-dynamodb aws-cdk


    【解决方案1】:

    您是否尝试过像中一样使用 addGlobalSecondaryIndex 方法

    event_table.addGlobalSecondaryIndex({indexName: "...", partitionKey: "...", ...})
    

    查看documentation 的方法。

    【讨论】:

    • 这只是返回 AttributeError: 'Table' object has no attribute 'addGlobalSecondaryIndex
    【解决方案2】:

    应在 Table 类上调用 addGlobalSecondaryIndex。

    下面的代码(打字稿)非常适合我:

    const table = new ddb.Table(this, "EventsTable", {
      tableName: "event-table-name",
      partitionKey: { name: 'composite', type: ddb.AttributeType.STRING },
      sortKey: { name: 'switch_ref', type: ddb.AttributeType.STRING },
      removalPolicy: cdk.RemovalPolicy.DESTROY,
      billingMode: BillingMode.PAY_PER_REQUEST,
      stream: StreamViewType.NEW_IMAGE
    });
    table.addGlobalSecondaryIndex({
      indexName: 'mpan-status-idex',
      partitionKey: { name: 'field1', type: ddb.AttributeType.STRING },
      sortKey:  { name: 'field2', type: ddb.AttributeType.STRING }
    });
    

    【讨论】:

    • 我在寻找 python 解决方案。但是认为python根本没有得到适当的支持,我可能需要简单地使用打字稿版本
    • @Matt - 简单地说 Python 使用下划线命名约定,所以你必须使用 add_global_secondary_index(),而不是 addGlobalSecondaryIndex()。效果很好。
    • Way necro 在这里发表评论 - 但值得注意的是,CDK 没有“不正确支持”的语言。 Typescript 之外的所有子语言都使用自定义 AWS 解释器编译成 TypesScript - 这就是为什么您可以从 Python CDK 中的节点获取类型错误,并且自定义构造可以用任何语言编写并分发给 CDK 的任何语言用户使用。当然,该过程中可能存在错误,但无论如何 - CDK 的 python 版本是直接从 Typescript 版本派生的。
    【解决方案3】:

    对于任何寻找这个并通过谷歌搜索偶然发现它的人:

    用通常的方式创建你的表:

    from aws_cdk import aws_dynamodb as dynamodb
    from aws_cdk.aws_dynamodb import Attribute, AttributeType, ProjectionType
    
    table = dynamodb.Table(self, 'tableID',
                        partition_key=Attribute(name='partition_key', type = AttributeType.STRING))
    

    然后以几乎相同的方式添加您的全局二级索引:

    table.add_global_secondary_index( 
               partition_key=Attribute(name='index_hash_key', type=AttributeType.NUMBER),
               sort_key=Attribute(name='range_key', type=AttributeType.STRING),
               index_name='some_index')
    

    您可以使用 kwarg 参数添加投影属性:

    projection_type = ProjectionType.INCLUDE,
    non_key_attributes= ['list', 'of', 'attribute','names']
    

    如果你不包含它,projection_type 默认为 All。

    我知道文档在很多方面都不完整,但可以在这里找到:

    https://docs.aws.amazon.com/cdk/api/latest/python/aws_cdk.aws_dynamodb/Table.html?highlight=add_global#aws_cdk.aws_dynamodb.Table.add_global_secondary_index

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-14
      • 2019-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多