使用boto3在DynamoDB中创建“ SS”项

时间:2018-11-09 21:30:18

标签: python-3.x amazon-web-services amazon-dynamodb boto3

我试图使用boto3在AWS DynamoDB中创建一个项目,无论我尝试什么,我都无法设法创建类型为'SS'的项目。这是我的代码:

client = boto3.resource('dynamodb', region_name=region)
table = client.Table(config[region]['table'])
sched = {
    "begintime": begintime,
    "description": description,
    "endtime": endtime,
    "name": name,
    "type": "period",
    "weekdays": [weekdays]
}
table.put_item(Item=sched)

其他列工作正常,但是无论我尝试什么,weekdays总是以'S'类型结尾。作为参考,这是同一张表中其他一项的外观:

{'begintime': '09:00', 'endtime': '18:00', 'description': 'Office hours', 'weekdays': {'mon-fri'}, 'name': 'office-hours', 'type': 'period'}

尝试将其转换为Python结构显然失败了,因此我不确定如何插入新项。

2 个答案:

答案 0 :(得分:2)

要使用boto3 DynamoDB资源级方法指示类型为SS(字符串集)的属性,您需要提供一个集合而不是简单的列表。例如:

import boto3

res = boto3.resource('dynamodb', region_name=region)

table = res.Table(config[region]['table'])

sched = {
    "begintime": '09:00',
    "description": 'Hello there',
    "endtime": '14:00',
    "name": 'james',
    "type": "period",
    "weekdays": set(['mon', 'wed', 'fri'])
}

table.put_item(Item=sched)

答案 1 :(得分:0)

跟进@jarmod的答案:

如果要使用字符串集调用 update_item ,则可以通过 ExpressionAttributeValues 属性插入一个集,如下所示:

entry = table.put_item(
    ExpressionAttributeNames={
        "#begintime": "begintime",
        "#description": "description",
        "#endtime": "endtime",
        "#name": "name",
        "#type": "type",
        "#weekdays": "weekdays"
    },
    ExpressionAttributeValues={
        ":begintime": '09:00',
        ":description": 'Hello there',
        ":endtime": '14:00',
        ":name": 'james',
        ":type": "period",
        ":weekdays": set(['mon', 'wed', 'fri'])
    },
    UpdateExpression="""
        SET #begintime= :begintime,
        #description = :description,
        #endtime = :endtime,
        #name = :name,
        #type = :type,
        #weekdays = :weekdays
        """
)

(提示:AttributeUpdates(与 put_item 调用相关的 Item 等效项)的用法已过时,因此,我建议使用 ExpressionAttributeNames ExpressionAttributeValues UpdateExpression )。