Python 使用boto向DynamoDB表添加项数据不起作用

Python 使用boto向DynamoDB表添加项数据不起作用,python,add,amazon-dynamodb,boto,items,Python,Add,Amazon Dynamodb,Boto,Items,我一直在尝试使用boto将项目添加到DynamoDB表中,但不知何故,它似乎不起作用。我尝试使用users.Item()和users.put\u Item,但没有任何效果。下面是我正在使用的脚本。 导入boto.dynamodb2 导入boto.dynamodb2.items 导入json 从boto.dynamodb2.fields导入HashKey、RangeKey、GlobalAllIndex 从boto.dynamodb2.layer1导入dynamodb连接 从boto.dynamod

我一直在尝试使用boto将项目添加到DynamoDB表中,但不知何故,它似乎不起作用。我尝试使用users.Item()和users.put\u Item,但没有任何效果。下面是我正在使用的脚本。 导入boto.dynamodb2 导入boto.dynamodb2.items 导入json 从boto.dynamodb2.fields导入HashKey、RangeKey、GlobalAllIndex 从boto.dynamodb2.layer1导入dynamodb连接 从boto.dynamodb2.table导入表 从boto.dynamodb2.items导入项目 从boto.dynamodb2.types导入编号

region = "us-east-1"
con = boto.dynamodb2.connect_to_region(region)
gettables = con.list_tables()
mytable = "my_table"

if mytable not in gettables['TableNames']:
    print "The table *%s* is not in the list of tables created. A new table will be created." % req_table
    Table.create(req_table,
              schema = [HashKey('username'),
                        RangeKey('ID', data_type = NUMBER)],
             throughput = {'read': 1, 'write': 1})
else:    
    print "The table *%s* exists." % req_table

con2table = Table(req_table,connection=con)
con2table.put_item(data={'username': 'abcd',
                         'ID': '001',
                         'logins':'10',
                         'timeouts':'20'
                         'daysabsent': '30'
                         })
我尝试了这个,创建了表,它很好。但是,当我尝试放入这些项目时,会收到以下错误消息

Traceback (most recent call last):
  File "/home/ec2-user/DynamoDB_script.py", line 29, in <module>
    'daysabsent':'30'
  File "/usr/lib/python2.7/dist-packages/boto/dynamodb2/table.py", line 821,       in put_item
    return item.save(overwrite=overwrite)
  File "/usr/lib/python2.7/dist-packages/boto/dynamodb2/items.py", line 455,  in save
    returned = self.table._put_item(final_data, expects=expects)
  File "/usr/lib/python2.7/dist-packages/boto/dynamodb2/table.py", line 835, in _put_item
    self.connection.put_item(self.table_name, item_data, **kwargs)
  File "/usr/lib/python2.7/dist-packages/boto/dynamodb2/layer1.py", line 1510, in put_item
    body=json.dumps(params))
  File "/usr/lib/python2.7/dist-packages/boto/dynamodb2/layer1.py", line 2842, in make_request
    retry_handler=self._retry_handler)
  File "/usr/lib/python2.7/dist-packages/boto/connection.py", line 954, in _mexe
    status = retry_handler(response, i, next_sleep)
  File "/usr/lib/python2.7/dist-packages/boto/dynamodb2/layer1.py", line 2882, in _retry_handler
    response.status, response.reason, data)
boto.dynamodb2.exceptions.ValidationException: ValidationException: 400 Bad Request
{u'message': u'One or more parameter values were invalid: Type mismatch for  key version expected: N actual: S', u'__type':   u'com.amazon.coral.validate#ValidationException'}
回溯(最近一次呼叫最后一次):
文件“/home/ec2 user/DynamoDB_script.py”,第29行,在
“daysabsent”:“30”
文件“/usr/lib/python2.7/dist packages/boto/dynamodb2/table.py”,第821行,输入项
返回项目。保存(覆盖=覆盖)
文件“/usr/lib/python2.7/dist-packages/boto/dynamodb2/items.py”,第455行,保存
返回值=self.table.\u put\u项(最终数据,期望值=期望值)
文件“/usr/lib/python2.7/dist packages/boto/dynamodb2/table.py”,第835行,输入项
self.connection.put_项(self.table_名称、项数据,**kwargs)
文件“/usr/lib/python2.7/dist packages/boto/dynamodb2/layer1.py”,第1510行,输入项
body=json.dumps(参数))
文件“/usr/lib/python2.7/dist packages/boto/dynamodb2/layer1.py”,第2842行,在make_请求中
retry\u handler=self.\u retry\u handler)
文件“/usr/lib/python2.7/dist-packages/boto/connection.py”,第954行,在
状态=重试\u处理程序(响应、i、下一个\u睡眠)
文件“/usr/lib/python2.7/dist packages/boto/dynamodb2/layer1.py”,第2882行,在“重试”处理程序中
响应。状态、响应。原因、数据)
boto.dynamodb2.exceptions.ValidationException:ValidationException:400错误请求
{u'message':u'一个或多个参数值无效:应为密钥版本的类型不匹配:N实际值:S',u''u类型:u'com.amazon.coral.validate#ValidationException'}

谢谢。

从您收到的错误消息中,听起来好像您正在尝试发送DynamoDB中定义为数字的属性的字符串值


具体问题似乎与您的范围键
ID
有关,它被定义为一个数值
N
,但您正在向它发送一个字符串值
'001'
看起来您尝试加载的值中有一个值为空。 我在尝试加载此文件时遇到了相同的错误。当partner_name属性为空字符串时,我遇到异常

try:
  item_old = self.table.get_item(hash_key=term)
except BotoClientError as ex:
   # if partner alias does not exist then create a new entry!
     if ex.message == "Key does not exist.":
          item_old = self.table.new_item(term)
            else:
                raise ex
        item_old['partner_code'] = partner_code
        item_old['partner_name'] = partner_name
        item_old.put()