我似乎无法理解 AWS Ruby SDK 文档中 DynamoDB 的概念(或更具体地说是 DynamoDB 数据模型的概念)。
具体来说,我一直在阅读:http://docs.aws.amazon.com/AWSRubySDK/latest/frames.html#!AWS/DynamoDB.html 请注意:我也已经阅读了数据模型文档,但仍然不理解;我希望能够通过 Ruby 中的一个正确示例来澄清我的困惑。
在下面的代码片段中,我创建了一个名为“my_books”的表,它具有名为“item_id”的主键,并且它是一个 Hash 键(而不是一个 Hash/Range 组合)...
但现在它返回以下错误...
具体来说,我一直在阅读:http://docs.aws.amazon.com/AWSRubySDK/latest/frames.html#!AWS/DynamoDB.html 请注意:我也已经阅读了数据模型文档,但仍然不理解;我希望能够通过 Ruby 中的一个正确示例来澄清我的困惑。
在下面的代码片段中,我创建了一个名为“my_books”的表,它具有名为“item_id”的主键,并且它是一个 Hash 键(而不是一个 Hash/Range 组合)...
dyn = AWS::DynamoDB::Client::V20120810.new
# => #<AWS::DynamoDB::Client::V20120810>
dyn.create_table({
:attribute_definitions => [
{ :attribute_name => "item_id", :attribute_type => "N" }
],
:table_name => "my_books",
:key_schema => [
{ :attribute_name => "item_id", :key_type => "HASH" },
],
:provisioned_throughput => {
:read_capacity_units => 10,
:write_capacity_units => 10
}
})
# => {:table_description=>{:attribute_definitions=>[{:attribute_name=>"item_id", :attribute_type=>"N"}], :table_name=>"my_books", :key_schema=>[{:attribute_name=>"item_id", :key_type=>"HASH"}], :table_status=>"ACTIVE", :creation_date_time=>2014-11-24 16:59:47 +0000, :provisioned_throughput=>{:number_of_decreases_today=>0, :read_capacity_units=>10, :write_capacity_units=>10}, :table_size_bytes=>0, :item_count=>0}}
dyn.list_tables
# => {:table_names=>["my_books"]}
dyn.scan :table_name => "my_books"
# => {:member=>[], :count=>0, :scanned_count=>0}
我接下来会尝试添加一个新的项目到表格中。我的理解是,我需要为item_id
(这是主键)指定数值,然后再为我要添加到表格中的新项目/记录/文档指定其他属性...
dyn.put_item(
:table_name => "my_books",
:item => {
"item_id" => 1,
"item_title" => "My Book Title",
"item_released" => false
}
)
但是最后一条命令返回以下错误:
expected hash value for value at key item_id of option item
虽然我不太明白哈希值由什么生成,但我尝试进行如下操作:
dyn.put_item(
:table_name => "my_books",
:item => {
"item_id" => { "N" => 1 },
"item_title" => "My Book Title",
"item_released" => false
}
)
但现在它返回以下错误...
expected string value for key N of value at key item_id of option item
我尝试了不同的变化,但似乎无法弄清楚这是如何工作的?
编辑/更新: 根据Uri Agassi的建议 - 我将值从1
更改为"1"
。我不太确定为什么这必须被引用,因为我已经定义类型为数字而不是字符串,但好吧,让我们接受这个并继续。
..."item_id" => { "N" => "1" },...
- 根据错误信息,期望一个字符串值。 - Uri Agassi